数据结构考研复习(顺序栈)

顺序栈的创建与顺序表类似,同样需要地址连续的存储单元,因此可以参考之前的内容进行处理:

https://www.cnblogs.com/hortz/p/15080282.html

与此同时,也可以发现之前的代码依然存在不少问题,比如无效变量以及代码繁琐,重复率高等,总之还是很有收获。

#include<stdio.h>

#define MaxSize 50

typedef struct {
    int data[MaxSize];
    int top;
}SqStack;

/* -1- 初始化顺序栈*/
bool InitStack(SqStack &S){
    S.top = -1;//初始化栈顶指针
    return true;
}

/*-2- 判断是否栈空*/
bool StackEmpty(SqStack S){
    if(S.top == -1){
        return true;
    }
    else
    {
        return false;
    }
}

/* -3- 进栈(插入元素)*/
bool Push(SqStack &S,int e){
    if(S.top == MaxSize-1)
    {
        printf("栈满!\n");
        return false;
    }
    S.data[++S.top] = e;//指针先加一,再入栈

    return true;
}

/* -4- 读取栈顶元素*/
bool GetTop(SqStack S,int &e){
    if(StackEmpty(S))//S.top == -1
    {
        printf("栈空!\n");
        return false;
    }
    e = S.data[S.top];

    return true;
}

/* -5- 出栈*/
bool Pop(SqStack &S,int &e){
    if(StackEmpty(S))//S.top == -1
    {
        printf("栈空!\n");
        return false;
    }
    e = S.data[S.top--];//先出栈指针再减一

    return true;
}


int main(){
    SqStack S;
    if(InitStack(S))
    {
        printf("创建成功!\n");
        printf("===========\n");
    }
    else
    {
        printf("创建失败!\n");
    }
    int e_1,l;
    printf("请输入顺序栈的长度\n");
    scanf("%d",&l);
    printf("请依次输入%d个值:\n",l);

    for(int i = 1;i <= l;i++)
    {
        scanf("%d",&e_1);
        Push(S,e_1);
    }

    int flag;
    printf("请进行选择:\n");
    printf("==1.输出栈顶元素\n");
    printf("==2.依次出栈(输出)\n");
    printf("==3.输出栈底元素\n");
    scanf("%d",&flag);
    switch(flag){
    case(1):
        {
            int e_2;
            GetTop(S,e_2);
            printf("栈顶元素为:%d  ",e_2);
            printf("\n");
            break;
        }
    case(2):
        {
            int e_2,i=0;
            while(l > 0){
                GetTop(S,e_2);
                printf("此时栈顶元素是 【%d】 当前已执行%d次出栈操作\n",e_2,i);
                Pop(S,e_2);
                l--;
                i++;
            }
            printf("结束!\n");
            break;
        }
    case(3):
        {
            SqStack T;
            if(!InitStack(T))
            {
                printf("发生错误!");
                return false;
            }
            int e_4;
            Push(T,GetTop(S,e_4));
            Pop(S,e_4);
            GetTop(T,e_4);//这部分或许可以用来作逆置栈的操作。
            printf("栈底元素为:%d\n",e_4);
            break;
        }
    }

  return 0;
}

最终结果:

 

 

 

 

posted on 2021-08-02 19:51  HOr7z  阅读(53)  评论(0编辑  收藏  举报