warning: 这篇文章距离上次修改已过424天,其中的内容可能已经有所变动。

栈比链表,顺序表简单,遵守先入后出原则,入栈/出栈只能操作栈顶元素。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define stacksize 10//栈初始最大长度
typedef struct{
    int *data;//栈的游标指针
    int top;//栈顶
    int size;//栈容量
}Stack;//创建栈
 
int emptystack(Stack* S){
    return S->top==0;
}//判断是否为空栈
 
Stack* initstack(){
    Stack* S=(Stack*)malloc(sizeof(Stack));//分配栈空间
    S->data=(int*)malloc(sizeof(int)*(stacksize));//分配data数组空间
    S->top=0;//初始化栈顶从0开始
    S->size=stacksize;//设置栈数组最大容量
    int judge=emptystack(S);
    if(judge==1)//判断栈是否为空
        printf("栈创建成功,当前为空栈\n");
    else
        printf("栈创建失败,当前不为空\n");
    return S;
}//初始化栈
 
void printstack1(Stack* S){
    Stack* smove=S;
    for(int i=smove->top-1;i>=0;i--){
        printf("%d ",smove->data[i]);
    }
    printf("\n");
}//按出栈顺序输出栈
 
void printstack2(Stack* S){
    Stack* smove=S;
    for(int i=0;i<smove->top;i++){
        printf("%d ",smove->data[i]);
    }
    printf("\n");
}//按入栈顺序输出栈
 
void increasestack(Stack* S){
    int increasesize;
    printf("请输入需增加的栈容量(单位为int):");
    scanf("%d",&increasesize);
    int Flag=1;
    int* increasedata=NULL;//定义新指针扩容data数组
    while(Flag){
        increasedata=(int*)realloc(S->data,sizeof(int)*((S->size)+increasesize));
        //扩容data数组
        if(increasedata!=NULL){
            Flag=0;//结束循环
        }
    }
    S->data=increasedata;
    S->size=(S->size)+increasesize;
                printf("栈扩容成功,当前栈最大容量为%d\n",S->size);
}//增加栈容量
 
void pushstack(Stack* S){
    int value;
    printf("请输入需入栈元素值:");
    scanf("%d",&value);
    if(S->top==S->size){
        increasestack(S);//调用扩容函数
        S->data[S->top]=value;//每次push的元素为当前新栈顶
        S->top=S->top+1;
    }//栈溢出自动扩容
    else{
        S->data[S->top]=value;
        S->top=S->top+1;
    }
    printf("该元素已入栈\n");
}//入栈
 
void popstack(Stack* S){
    if(S->top==0){
        printf("当前栈为空\n");
    }
    else{
        S->top=S->top-1;
        printf("栈顶元素已出栈\n");
    }
}//出栈
 
void returntop(Stack* S){
    printf("当前栈顶元素值为%d\n",S->data[S->top-1]);
}//返回栈顶元素
 
void returnlen(Stack* S){
    printf("当前栈长度为%d\n",S->top);
}//返回栈长度
 
void searchstack(Stack* S){
    int value;
    printf("请输入需查询的元素:");
    scanf("%d",&value);
    for(int i=0;i<S->size;i++){
        if(S->data[i]==value){
            printf("查询成功,该元素在第%d位\n",i+1);
            return;
        }
    }
    printf("查询失败,栈中无该元素\n");
}//查询栈中元素
 
void clearstack(Stack* S){
    if(S==NULL)//当前栈已为空
        return;
    else{
        free(S->data);
        free(S);
    }
    printf("当前栈已清空,已自动退出程序\n");
    exit(0);
}//清空栈
 
void endsystem(Stack* S){
    clearstack(S);
    exit(0);
}//结束程序
 
void stackmenu(){
    printf("1.按出栈顺序输出栈\n");
    printf("2.按入栈顺序输出栈\n");
    printf("3.栈扩容\n");
    printf("4.元素入栈\n");
    printf("5.元素出栈\n");
    printf("6.返回栈顶元素\n");
    printf("7.返回栈长度\n");
    printf("8.根据值查询元素位置\n");
    printf("9.清空栈\n");
    printf("0.退出程序\n");
}//栈功能菜单
 
int main(){
    Stack* S=initstack();//初始化创建栈
    int sort,flag=1;
    while(flag){
        stackmenu();
        printf("请输入数字选择功能:");
        scanf("%d",&sort);
        switch(sort){
            case 1:{
                printstack1(S);
                break;
            }
            case 2:{
                printstack2(S);
                break;
            }
            case 3:{
                increasestack(S);
                break;
            }
            case 4:{
                pushstack(S);
                break;
            }
            case 5:{
                popstack(S);
                break;
            }
            case 6:{
                returntop(S);
                break;
            }
            case 7:{
                returnlen(S);
                break;
            }
            case 8:{
                searchstack(S);
                break;
            }
            case 9:{
                clearstack(S);
                break;
            }
            case 0:{
                endsystem(S);
                break;
            }
        }
        printf("\n");
    }
}
none
最后修改于:2023年11月25日 18:33

评论已关闭