两个栈共用一个顺序存储空间的代码
2008-04-08 22:23
260 查看
#include<iostream.h>
#define STACK_INIT_SIZE 10//存储的初始分配
struct Dblstack{
int *base1;
int *base2;
int *top1;
int *top2;
int stacksize;//当前分配的存储空间,以元素为单位
};
int Initstack(Dblstack &s)
{//构造一个空的顺序栈s
s.base1=new int[STACK_INIT_SIZE];
if(!s.base1){cout<<"申请内存失败!/n";return 0;}
s.top1=s.base1+1;
s.stacksize=STACK_INIT_SIZE;
s.base2=s.base1+s.stacksize;
s.top2=s.base2-1;
return 1;
}
int emptystack(Dblstack &s,int i)
{//判断栈是否为空,是返回1,否则返回0
if(i==1&&s.top1==s.base1+1||i==2&&s.top2==s.base2-1)
return 1;
else return 0;
}
int fullstack(Dblstack &s)
{//判断栈是否已经满,若栈满则返回1否则返回0
if(s.top1==s.top2) return 1;
else return 0;
}
int push(Dblstack &s,int i,int x)
{//插入元素x作为新的栈顶元素
if(fullstack(s)){ cout<<"栈满/n"; return 0;}
else{
if(i==1) {cout<<"插入操作成功!/n/n"; *s.top1++=x; }
if(i==2) {cout<<"插入操作成功!/n/n"; *s.top2--=x; }
}return 1;
}
int pop(Dblstack &s,int i,int &x)
{//若栈不为空则删除i栈中的栈顶元素用x返回,否则返回0
if(emptystack(s,i)) return 0;
else{
if(i==1) {cout<<"出栈成功!出栈元素为:"; x=*--s.top1; }
if(i==2) {cout<<"出栈成功!出栈元素为:"; x=*++s.top2; }
}return 1;
}
int gettop(Dblstack &s,int i,int &x)
{//若栈不为空,则用x返回栈顶元素,并返回真,否则返回0
if(emptystack(s,i)) return 0;
else{
if(i==1) { x=*(s.top1-1); cout<<"/n出栈成功!栈顶为:"; }
if(i==2) { x=*(s.top2+1); cout<<"/n出栈成功!栈顶为:"; }
}return 1;
}
int clearstack( Dblstack &s)
{//若栈为空返回1,否则将栈置为空后返回1
if(emptystack(s,1)&&emptystack(s,2)) return 1;
else {s.top1=s.base1+1; s.top2=s.base2-1;}
return 1;
}
int stacktraverse(Dblstack s)
{ // 从栈底到栈顶依次输出栈中每个元素
// 一旦visit()失败,则操作失败
while(s.top1-1>s.base1)
{ s.base1++;
cout<<*s.base1<<'/t';
}
while(s.top2+1<s.base2)
{ s.base2--;
cout<<*s.base2<<'/t';
}
cout<<endl;
return 1;
}
void welcome() //界面的欢迎函数
{
cout<<"/t欢迎使用本程序"<<endl;
cout<<"/t本程序为顺序栈的公用问题"<<endl;
cout<<"/t1进入程序/t0退出程序"<<endl;
cout<<"/t请选择你的操作!"<<endl;
}
void menue()//菜单界面函数
{ cout<<"/t请你选择所需要的操作/n";
cout<<"/t1-元素入栈/t2-元素出栈/n";
cout<<"/t3-取栈顶元素/t4-测栈空/n";
cout<<"/t5-清空栈/t6-遍历/n";
cout<<"/t/t7-退出/n";
}
void main()
{
int choice,e,x,i;
Dblstack s;
Initstack(s);
welcome();
cin>>e;
if(e==1)
{
do{menue();
cin>>choice;
switch(choice)
{
case 1://入栈
cout<<"请输入插入元素的值!";
cin>>x;
cout<<"/n选择插入哪个栈顶!(1||2):";
cin>>i;
cout<<endl;
push(s,i,x);
break;
case 2://出栈
cout<<"请选择出栈元素所在的栈:";
cin>>i;
cout<<endl;
if(emptystack(s,i)){cout<<"此栈空!/n";break;}
else{
pop( s,i,x);
cout<<x<<endl;
cout<<endl;
break;
}
case 3://获取栈顶元素
cout<<"请选择取栈顶元素所在的栈:/n";
cin>>i;
gettop( s, i, x);
cout<<x<<endl;
break;
case 4://测栈空
if(emptystack(s,1)&&emptystack(s,2))
cout<<"栈空"<<endl;
else
cout<<"栈不空"<<endl;
break;
case 5://清空栈
clearstack( s);
break;
case 6:
stacktraverse(s);
break;
case 7:
cout<<"程序结束"<<endl;
break;
default:
cout<<"不合适的操作/n";
break;
}
}while(choice!=7);
}cout<<"感谢使用此程序:"<<endl;
}
#define STACK_INIT_SIZE 10//存储的初始分配
struct Dblstack{
int *base1;
int *base2;
int *top1;
int *top2;
int stacksize;//当前分配的存储空间,以元素为单位
};
int Initstack(Dblstack &s)
{//构造一个空的顺序栈s
s.base1=new int[STACK_INIT_SIZE];
if(!s.base1){cout<<"申请内存失败!/n";return 0;}
s.top1=s.base1+1;
s.stacksize=STACK_INIT_SIZE;
s.base2=s.base1+s.stacksize;
s.top2=s.base2-1;
return 1;
}
int emptystack(Dblstack &s,int i)
{//判断栈是否为空,是返回1,否则返回0
if(i==1&&s.top1==s.base1+1||i==2&&s.top2==s.base2-1)
return 1;
else return 0;
}
int fullstack(Dblstack &s)
{//判断栈是否已经满,若栈满则返回1否则返回0
if(s.top1==s.top2) return 1;
else return 0;
}
int push(Dblstack &s,int i,int x)
{//插入元素x作为新的栈顶元素
if(fullstack(s)){ cout<<"栈满/n"; return 0;}
else{
if(i==1) {cout<<"插入操作成功!/n/n"; *s.top1++=x; }
if(i==2) {cout<<"插入操作成功!/n/n"; *s.top2--=x; }
}return 1;
}
int pop(Dblstack &s,int i,int &x)
{//若栈不为空则删除i栈中的栈顶元素用x返回,否则返回0
if(emptystack(s,i)) return 0;
else{
if(i==1) {cout<<"出栈成功!出栈元素为:"; x=*--s.top1; }
if(i==2) {cout<<"出栈成功!出栈元素为:"; x=*++s.top2; }
}return 1;
}
int gettop(Dblstack &s,int i,int &x)
{//若栈不为空,则用x返回栈顶元素,并返回真,否则返回0
if(emptystack(s,i)) return 0;
else{
if(i==1) { x=*(s.top1-1); cout<<"/n出栈成功!栈顶为:"; }
if(i==2) { x=*(s.top2+1); cout<<"/n出栈成功!栈顶为:"; }
}return 1;
}
int clearstack( Dblstack &s)
{//若栈为空返回1,否则将栈置为空后返回1
if(emptystack(s,1)&&emptystack(s,2)) return 1;
else {s.top1=s.base1+1; s.top2=s.base2-1;}
return 1;
}
int stacktraverse(Dblstack s)
{ // 从栈底到栈顶依次输出栈中每个元素
// 一旦visit()失败,则操作失败
while(s.top1-1>s.base1)
{ s.base1++;
cout<<*s.base1<<'/t';
}
while(s.top2+1<s.base2)
{ s.base2--;
cout<<*s.base2<<'/t';
}
cout<<endl;
return 1;
}
void welcome() //界面的欢迎函数
{
cout<<"/t欢迎使用本程序"<<endl;
cout<<"/t本程序为顺序栈的公用问题"<<endl;
cout<<"/t1进入程序/t0退出程序"<<endl;
cout<<"/t请选择你的操作!"<<endl;
}
void menue()//菜单界面函数
{ cout<<"/t请你选择所需要的操作/n";
cout<<"/t1-元素入栈/t2-元素出栈/n";
cout<<"/t3-取栈顶元素/t4-测栈空/n";
cout<<"/t5-清空栈/t6-遍历/n";
cout<<"/t/t7-退出/n";
}
void main()
{
int choice,e,x,i;
Dblstack s;
Initstack(s);
welcome();
cin>>e;
if(e==1)
{
do{menue();
cin>>choice;
switch(choice)
{
case 1://入栈
cout<<"请输入插入元素的值!";
cin>>x;
cout<<"/n选择插入哪个栈顶!(1||2):";
cin>>i;
cout<<endl;
push(s,i,x);
break;
case 2://出栈
cout<<"请选择出栈元素所在的栈:";
cin>>i;
cout<<endl;
if(emptystack(s,i)){cout<<"此栈空!/n";break;}
else{
pop( s,i,x);
cout<<x<<endl;
cout<<endl;
break;
}
case 3://获取栈顶元素
cout<<"请选择取栈顶元素所在的栈:/n";
cin>>i;
gettop( s, i, x);
cout<<x<<endl;
break;
case 4://测栈空
if(emptystack(s,1)&&emptystack(s,2))
cout<<"栈空"<<endl;
else
cout<<"栈不空"<<endl;
break;
case 5://清空栈
clearstack( s);
break;
case 6:
stacktraverse(s);
break;
case 7:
cout<<"程序结束"<<endl;
break;
default:
cout<<"不合适的操作/n";
break;
}
}while(choice!=7);
}cout<<"感谢使用此程序:"<<endl;
}
相关文章推荐
- 给出两个表示两个非负整数的非空链表。数字以相反的顺序存储,它们的每个节点都包含一个数字。添加两个数字,并将其作为链接列表返回。
- 两个堆栈共用一块新的存储空间溶液
- 数据结构(C实现)------- 顺序队列(循环队列之少用一个存储空间实现) .
- 两个域名共用一个空间的实现方法
- 两栈共享存储空间(用一个数组存储两个栈)
- 假设以两个元素依值递增有序排列的线性表A和B分别表示两个集合,现要求另辟空间构成一个顺序链表C
- 算法导论 顺序双向栈——两个栈共享同一存储空间
- 两个或多个域名共用一个空间并可以独立访问的方法
- 两个域名共用一个空间的实现方法
- 要完整准确的 均以单链表作存储结构 试编写算法将A表和B表归并成一个按元素值递减有序的线性表C 【数据结构】假设有两个按元素值递增有序的线性表A和B 并要求利用原表的空间存放C。谁会么
- 数据结构链表习题2.27,假设以两个元素依值递增有序排列的线性表A和B分别表示两个集合,现要求另辟空间构成一个顺序链表
- 设计算法并写出代码移除字符串中重复的字符,不能使用额外的缓存空间。注意: 可以使用额外的一个或两个变量,但不允许额外再开一个数组拷贝。
- 从一个队列中取出一个元素再放回去同时保持原来的顺序,不申请非必需的空间存储队列中的元素
- 设有两个栈S1和S2都采用顺序栈的方式存储,并且共享一个存储区
- 图片存储架构学习:独立的图片服务器,给爱一个独立的空间
- 有两个磁盘文件A和B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列),输出到一个新文件C中。
- android获取手机内部存储空间和外部存储空间 && 如何确定一个应用的安装位置
- 关于 OnCloseQuery: 顺序、不能关机等(所有的windows的广播消息都是逐窗口传递的)——如果一个窗体的OnCloseQuery事件中如果写了代码那么WM_QUERYENDSESSION消息就传不过去了msg.result会返回0,关机事件也就停止了
- 写两个线程,一个线程打印1-52,另一个线程打印字母A-Z。打印 顺序为12A34B56C……5152Z
- 两个域名两个网站同时放到一个空间