将编号为0和1的两个栈存放于一个数组空间V【m】中, c++可运行版本

题目

将编号为0和1的两个栈存放于一个数组空间V[m]中,栈底分别处于数组的两端。当第0号栈的栈顶指针top[0]等于-1时该栈为空;当第1号栈的栈顶指针top[1]等于m时,该栈为空。两个栈均从两端向中间增长(见下图)。试编写双栈初始化,判断栈空、栈满、进栈和出栈等算法的函数。双栈数据结构的定义如下:
typedef struct{
int top [ 2],bot [ 2];//栈顶和栈底指针
SElemType *v ;//栈数组
int m ;//栈最大可容纳元素个数
}Dblstack;
在这里插入图片描述

代码

似乎还有点小bug 没心态改了,大佬们可以在评论区指点一下

#include <iostream>
#include<stdlib.h>
#include<string.h>
using namespace std;
#define MAXsize 100
typedef struct{
    int data[MAXsize];
    int top1;
    int top2;
}DStack;
int p1=0,p2=MAXsize;

//1.初始化
int InitDStack(DStack *DS){
    memset(DS->data,'\0',sizeof(int)*MAXsize);
    DS->top1=-1;
    DS->top2=MAXsize;
    return 0;
}
// 2.进栈
int DStackPush(DStack *DS,int e,int i)
{
    if(DS->top1+1==DS->top2)
        {
            //cout<<"满了"<<endl;
            return 1;
        }
    if(i==1){
        ++(DS->top1); //指针后移
        DS->data[DS->top1]=e;
    }else if(i==2){
        --(DS->top2);  //指针前移
        DS->data[DS->top2]=e;
    }
    return 0;
}
//3.pop
int DStackPop(DStack *DS,int e,int i)
{
    if(DS->top1==-1&&DS->top2==MAXsize){
        cout<<"both two stack is empty!"<<endl;
        return 1;
    }
    if(i==1)
    {
        if(DS->top1==-1)
        {
        cout<<"stack1 is empty!"<<endl;
        return 1;
        }

        e=DS->data[DS->top1];
        --DS->top1;
    }
    else if(i==2)
    {
        if(DS->top2==MAXsize)
       {
        cout<<"stack2 is empty!"<<endl;return 1;
       }
       e=DS->data[DS->top2];
       ++DS->top2;
    }
    return 0;
}
//4.输出 此处老夫有点问题在intmain里面我必须也得写&符号
//   以往在输出里因为不会改动栈是不用加&的
void display(DStack *DS,int i)
{

    if(i==1){
            p1=0;  //要从头(最左边)输出
        cout<<"栈1的元素为: (";
        while(DS->top1>=p1){
            cout<<DS->data[p1++]<<" ";
        }
        cout<<") 栈1输出完毕"<<endl;
    }
    else if(i==2){
        p2=MAXsize; //从最右边输出
        cout<<"栈2的元素为: (";
        while(p2>=DS->top2){
            cout<<DS->data[p2--]<<" ";
        }
        cout<<") 栈2输出完毕"<<endl;
    }
}
int main()
{
    DStack DS;
    int n;
    if(InitDStack(&DS)==0){
        cout<<"初始化成功!"<<endl;
    }
    int e,i;
    int r;  //存放返回值
    while(true)
    {
        cout<<"选择操作:"<<endl;
        cout<<"***********"<<endl;
        cout<<"1.输入数据"<<endl;
        cout<<"2.查看栈情况"<<endl;
        cout<<"3.出栈"<<endl;
        cout<<"4.结束"<<endl;
        cout<<"************"<<endl;
        cin>>n;
        switch(n){
        case 1:
            cout << "输入要插入的值以及栈号" << endl;
            cin>>e>>i;
            r=DStackPush(&DS,e,i);
            if(r==0)
            {
                cout<<"插入成功!,当前的栈"<<i<<"为:"<<endl;
                display(&DS,i);
            }
            else if(r==1){ cout<<"满了"<<endl;}
            break;
        case 2:
            display(&DS,1);
            display(&DS,2);
            break;
        case 3:
            cout << "输入要出栈的栈号" << endl;
            cin>>i;
            r=DStackPop(&DS,e,i);
            if(r==0)
            {
                cout<<"出栈成功!,当前的栈"<<i<<"为:"<<endl;
                display(&DS,i);
            }
            //else if(r==1){ cout<<"满了"<<endl;}   在函数内已经表示原因
            break;
        case 4:
            cout<<"感谢使用!"<<endl;
            return 0;
        }
    }
    return 0;
}

运行截图

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值