题目
将编号为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;
}
运行截图