顺序栈

AC代码:

#include <iostream>
#define Status int
#define SElemType int
#define MaxSize 3
using namespace std;

// 栈数据结构
typedef struct Stack
{
    SElemType *base;   // 栈底指针  不变
    SElemType *top;    // 栈顶指针 一直在栈顶元素的上一个位置
    int stacksize;  // 栈可用的最大容量
}SqStack;

// **************************************基本操作函数*****************************************//
// 初始化函数
Status InitStack(SqStack &s)
{
    s.base = new SElemType[MaxSize];
    if(!s.base)
    {
        cout<<"空间分配失败"<<endl;
        return 0;
    }
    s.top = s.base;    // 将栈顶指针初始化为与栈底指针相同,即初始化为空栈;
    s.stacksize = MaxSize;
    return 1;
}
// 入栈
Status Push(SqStack &s, SElemType e)
{
    if(s.top - s.base == s.stacksize) // 栈满
        return 0;
    *(s.top++) = e; // 先入栈,再修改栈顶指针
    return 1;
}
// 出栈
Status Pop(SqStack &s, SElemType &e)
{
    if(s.top == s.base)
        return 0;
    e = *(--s.top); // 先修改栈顶指针,再出栈
    return 1;
}
// 取栈顶元素,不修改指针
bool GetTop(SqStack s, SElemType &e) // 传参为传值,形参修改不影响实参;
{
    if(s.top == s.base)  // 栈空
        return false;
    else
        e = *(--s.top); // --s.top修改的是形参,不会修改真正的栈顶指针
        return true;
}
// **************************************功能实现函数************************************//
// 菜单
void menu()
{
    cout<<"********1.入栈             2.出栈********"<<endl;
    cout<<"********3.取栈顶         4.退出********"<<endl;
}
// 入栈功能函数 调用Push函数
void PushToStack(SqStack &s)
{
    int n; SElemType e; int flag;
    cout<<"请输入入栈元素个数(>=1):"<<endl;
    cin>>n;
    for(int i = 0; i<n; i++)
    {
        cout<<"请输入第"<<i+1<<"个元素的值:"<<endl;
        cin>>e;
        flag = Push(s, e);
        if(flag)
            cout<<"元素"<<e<<"已入栈!"<<endl;
        else
            cout<<"该栈已满!"<<endl;
    }
}
// 出栈功能函数 调用Pop函数
void PopFromStack(SqStack &s)
{
    int n; SElemType e; bool flag;
    cout<<"请输入出栈元素个数(>=1):"<<endl;
    cin>>n;
    for(int i = 0; i<n; i++)
    {
        flag = Pop(s, e);
        if(flag)
            cout<<"元素"<<e<<"已出栈!"<<endl;
        else
            cout<<"该栈已空!"<<endl;
    }
}
// 取栈顶功能函数 调用GetTop函数
void GetTopOfStack(SqStack &s)
{
    SElemType e; bool flag;
    flag = GetTop(s, e);
    if(flag)
        cout<<"栈顶元素为:"<<e<<endl;
    else
        cout<<"该栈已空!"<<endl;
}
int main()
{
    SqStack s;
    int choice;
    InitStack(s);
    while(1)
    {
        menu();
        cout<<"请输入菜单序号:"<<endl;
        cin>>choice;
        if(choice == 4)
            break;
        switch(choice)
        {
            case 1: PushToStack(s); break;
            case 2: PopFromStack(s); break;
            case 3: GetTopOfStack(s); break;
            default : cout<<"输入错误!"<<endl;
        }
    }
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Gofor.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值