双栈

AC代码:

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

// 双栈数据结构
typedef struct
{
    SElemType *V;        // 栈数组的基地址
    SElemType *top[2]; // 栈顶指针
    SElemType *bot[2]; // 栈底指针
    int m;  // 栈可用最大容量
}DblStack;
// 初始化函数
Status InitStack(DblStack &s)
{
    s.V = new SElemType[MaxSize]; // 申请一块儿空间
    if(!s.V)
    {
        cout<<"空间分配失败"<<endl;
        return 0;
    }
    s.m = MaxSize; // m代表了栈数组的最大长度,后续出现的s.m其实与MaxSize等价
    s.top[0] = s.bot[0] = s.V; // top[0]始终指向栈顶元素的下一个位置
                                                // 初始化时,top[0]和]bot[0]指向V[0]的位置;
    s.top[1] = s.bot[1] = &s.V[s.m]; // top[1]始终指向栈顶元素的当前位置
                                                         // top[1]和bot[1]指向V[MaxSize]的位置

}
// 入栈函数
Status Push(DblStack &s, SElemType e, int stackNumber)
{
    if(s.top[0]==s.top[1])  // 判断栈满的条件;
    {
        return 0;
    }
    if(stackNumber==0)
    {
        *(s.top[0]++) = e; //栈0有元素进栈,先进栈,再修改栈顶指针;
    }
    else if(stackNumber==1)
    {
        *(--s.top[1]) = e; // 栈1有元素进栈,先修改栈顶指针,再进栈;
    }
    return 1;
}
// 出栈函数
Status Pop(DblStack &s, SElemType &e, int stackNumber)
{
    if(stackNumber==0)
    {
        if(*(s.top[0])==-1)  // 判断栈空的条件
        {
            return 0;
        }
        e = *(--s.top[0]);
        return 1;
    }
    else if(stackNumber==1)
    {
        if(s.top[1]==s.bot[1])     // 判断栈空的条件
        {
            cout<<"该栈已空!"<<endl;
            return 0;
        }
        e = *(s.top[1]++);
        return 1;
    }
}
// 入栈功能函数 调用Push函数
void PushToStack(DblStack &s)
{
    int n; SElemType e; int flag; int stackNumber;
    cout<<"请输入入栈元素个数(>=1)和栈的序号(0或1):"<<endl;
    cin>>n>>stackNumber;
    for(int i = 0; i<n; i++)
    {
        cout<<"请输入第"<<i+1<<"个元素的值:"<<endl;
        cin>>e;
        flag = Push(s, e, stackNumber);
        if(flag)
            cout<<"元素"<<e<<"已入栈!"<<endl;
        else
            cout<<"该栈已满!"<<endl;
    }
}
// 出栈功能函数 调用Pop函数
void PopFromStack(DblStack &s)
{
    int n; SElemType e; int flag; int stackNumber;
    cout<<"请输入出栈元素个数(>=1)和栈的序号:"<<endl;
    cin>>n>>stackNumber;
    for(int i = 0; i<n; i++)
    {
        flag = Pop(s, e, stackNumber);
        if(flag)
            cout<<"元素"<<e<<"已出栈!"<<endl;
        else
            cout<<"该栈已空!"<<endl;
    }
}
void menu()
{
    cout<<"********1.入栈             2.出栈********"<<endl;
    cout<<"********3.退出                    ********"<<endl;
}
int main()
{
    DblStack s;
    int choice;
    InitStack(s);
    while(1)
    {
        menu();
        cout<<"请输入菜单序号:"<<endl;
        cin>>choice;
        if(choice == 3)
            break;
        switch(choice)
        {
            case 1: PushToStack(s); break;
            case 2: PopFromStack(s); break;
            default : cout<<"输入错误!"<<endl;
        }
    }

}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Gofor.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值