【数据结构】第3章 栈和队列 顺序栈

【顺序栈的初始化、判空、取栈顶元素、入栈、出栈】
栈和队列是操作受限的线性表

顺序栈


S.base:栈底指针,始终指向栈底
S.top:栈顶指针, 栈空时指向栈底,栈非空时指向栈顶元素的上一个位置
栈满:S.top - S.base == S.stacksize
栈空:S.top == S.base 都指向栈底
入栈:*S.top++ = e 先入栈,再栈顶指针++
出栈:e = *--S.top 先栈顶指针- -,再出栈

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
typedef int Status;
typedef int SElemType;
#define OVERFLOW -1
#define ERROR 0
#define OK 1

//------顺序栈的存储结构-----
#define MAXSIZE 100
typedef struct
{
    SElemType *base;    //栈底指针
    SElemType *top;     //栈顶指针
    int stacksize;      //栈可用的最大容量
}SqStack;

SqStack S;

//1、顺序栈初始化
Status InitStack(SqStack &S)
{//构造一个空栈S
    S.base = new SElemType[MAXSIZE];    //为顺序栈动态分配一个最大容量为MAXSIZE的数组空间
    if(!S.base)
        exit(OVERFLOW);                 //储存分配失败
    S.top = S.base;                     //top初始为base,空栈
    S.stacksize = MAXSIZE;
    return OK;
}

//2、顺序栈销毁
//3、顺序栈清空
//4、顺序栈判空
int StackEmpty(SqStack S)
{
    if(S.top == S.base)
        return OK;
    else
        return ERROR;
}

//6、顺序栈取栈顶元素
SElemType GetTop(SqStack S)
{//返回S的栈顶元素, 不修改栈顶指针
    if(S.top != S.base)                 //栈非空
        return *(S.top - 1);            //返回栈顶元素的值,栈顶指针不变
}

//7、顺序栈入栈
Status Push(SqStack &S, SElemType e)
{//插入元素e为新的栈顶元素
    if(S.top - S.base == S.stacksize)
        return ERROR;                   //栈满
    *S.top++ = e;                       //先将元素e压入栈顶,再栈顶指针+1
    return OK;
}

//8、顺序栈出栈
Status Pop(SqStack &S, SElemType &e)
{//删除S的栈顶元素,用e返回其值
    if(S.top == S.base)
        return ERROR;                   //栈空
    e = *--S.top;                       //先栈顶指针-1,再将栈顶元素赋给e
    return OK;              
}

//测试
int main(){
    cout<<"-------------------顺序栈菜单---------------"<<endl;
    cout<<"0、退出程序"<<endl;
    cout<<"1、初始化"<<endl;
    cout<<"2、判空"<<endl;
    cout<<"3、获取顶端元素"<<endl;
    cout<<"4、入栈"<<endl;
    cout<<"5、出栈"<<endl;
    cout<<"-------------------------------------------"<<endl;
    int a, flag = 1;
    while(flag){
        cout<<'\n'<<"请选择要执行的操作:";
        cin>>a;
        switch(a){
            case 0: {
                cout<<"感谢使用本程序,祝您生活愉快!"<<'\n';
                flag = 0;
                break;
            }
            case 1: {
                if(InitStack(S))
                    cout<<"初始化完毕!"<<endl;
                else
                    cout<<"初始化失败"<<endl;
                break;
            }
            case 2: {
                if(StackEmpty(S))
                    cout<<"栈空"<<endl;
                else
                    cout<<"栈非空"<<endl;
                break;
            }
            case 3: {
                if(!StackEmpty(S))
                    cout<<"栈顶元素为:"<<GetTop(S)<<endl;
                else
                    cout<<"栈空,无法获取栈顶元素"<<endl;
                break;
            }
            case 4: {
                cout<<"请输入入栈元素:";
                SElemType e;
                cin>>e;
                if(Push(S, e))
                    cout<<e<<"元素已入栈!"<<endl;
                else
                    cout<<"栈满,无法入栈"<<endl;
                break;
            }
            case 5: {
                SElemType e;
                if(Pop(S, e))
                    cout<<e<<"元素已出栈!"<<endl;
                else
                    cout<<"栈空,无法出栈"<<endl;
                break;
            }
        }
    }
    return 0;
}

在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_碗碗儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值