实验报告顺序栈公用问题.docx
《实验报告顺序栈公用问题.docx》由会员分享,可在线阅读,更多相关《实验报告顺序栈公用问题.docx(10页珍藏版)》请在冰豆网上搜索。
实验报告顺序栈公用问题
实验顺序栈公用问题
姓名:
xxx班级:
xxx)
学号:
*****xxxxx实验时间:
2017.10.21
1.问题描述
顺序栈公用是指多个栈公用一个足够大的存储空间,利用栈的动态特性使其存储空间互补。
不涉及中设计两个栈
S1、S2共享一个存储区域V[n].定义一个共用栈类,数据成员应包括栈元素,两个栈顶等;函数成员应包括入栈、出栈取栈顶元素等基本操作。
2数据结构设计
一个栈包括其位置指针,头指针、栈的大小。
为此建立起数据结构如下
classSqStack{
private:
int*base1;//第一个栈
int*base2;//第二个栈
inttop1;//第一个栈头指针
inttop2;//第二个栈头指针
intstacksize;//栈大小
此处两个栈公用一个存储空间,我的想法是将两个头指针分别置于一组固定的存储空间的两端,依次移动实现公用一组存储空间
3.算法设计
(1)创建栈
由于要求用栈存储数据,而此处使用两个栈,所以在这里创建两个栈
SqStack:
:
SqStack(intm)//构造函数定义
{
//创建新栈
base1=newint[m];
base2=newint[m];
if(base1==NULL)//判断栈是否创建成功失败则退出
{
cout<<"栈
(1)创建失败,退出!
"<exit
(1);
}
if(base2==NULL)
{
cout<<"栈
(2)创建失败退出!
"<exit
(1);
}
stacksize=m;//栈的大小定义为m两个栈公用这一组空间
top1=-1;
top2=stacksize+1;
//两个栈头指针定义
}
(2)栈中元素插入
因为我们采用的是两个不同的栈,指针位置不同,而且头指针的移动方式也不一样,所以,我们插入时分不同方式插入
栈1:
Step1:
判断栈1是否有空间插入
if(top1+1==top2)
{cout<<"栈满"<exit
(1);
}
Step2:
指针后移,插入待插入元素
top1++;
base1[top1]=x;
cout<<"top1:
"<}
栈2:
Step1:
判断栈2是否有空间插入
if(top2-1==top1)
{cout<<"栈满"<exit
(1);
}
Step2:
指针前移,插入待插入元素
top2--;
base2[top2]=x;
intn=-1;
n++;
cout<<"top2"<}
(3)元素输出
同样是两个栈两个栈元素输出时,指针移动方向不一样
栈1
Step1:
判断是否栈空
intx;
if(top1==-1)throw"栈空,不能出栈";
Step2:
栈不空输出栈顶元素头指针下移
else
x=base1[top1--];
cout<<"top1="<returnx;
栈2:
Step1:
判断是否栈空
intx;
if(top2==stacksize+1)throw"栈空,不能出栈";
step2:
栈不空输出栈顶元素头指针上移
else
x=base2[top2++];
cout<<"top2="<returnx;
(4)取栈顶元素
取栈顶元素相对来说是比较简单的一个操作只需设定一个值将栈顶元素的值赋给这个数就可以了
Step1:
判断栈顶是否有元素
if(top1==-1)throw"栈空,栈顶无元素";
step2:
取出栈顶元素
returnbase1[top1];
上述是栈1的取值方式而栈2的取值方式有所不同
if(top2==stacksize+1)throw"栈空,栈顶无元素";
returnbase2[top2];
同样是两步走只是指针移动方式有所区别
(5)判断是否栈空
判断是否栈空这一步,看起来没有是么作用但在后期的循环判断中起着很大的作用
if(top1==-1)
return0;
else
return1;
同样栈1和栈2的指针移动方式有所不同
if(top2==stacksize+1)
return0;
else
return1;
(6)清空栈
我们在所有工作结束之后,要进行栈的清空
if(top2==stacksize+1)
return0;
else
return1;
以上是栈1的清空方式,即将头指针置于初始状态。
对于栈2同样也是如此但是栈2指针的初始位置又有所不同
top2=stacksize+1;
(7)栈的输出
当我们想要查看栈中元素的时候需要把栈输出
Step1:
定义一个变量将头指针的值赋给他
inti=top1;
step2;通过一个循环队列输出;
while(i>=0)
cout<cout<(8)界面设计
为了实现交互式界面我在程序初始界面中设置了一个交互界面
交互界面的实现主要是通过选择语句实现的
Step1:
定义一个选择变量
intchoice;
step2;显示选项
do
{
cout<<"1元素入栈(1)"<<'\n';
cout<<"2元素入栈(2)"<<'\n';
cout<<"3元素出栈(1)"<<'\n';
cout<<"4元素出栈(2)"<<'\n';
cout<<"5取栈(1)栈顶元素"<<'\n';
cout<<"6取栈(2)栈顶元素"<<'\n';
cout<<"7置空栈
(1)"<<'\n';
cout<<"8置空栈
(2)"<<'\n';
cout<<"9测栈
(1)空"<<'\n';
cout<<"10测栈
(2)空"<<'\n';
cout<<"11显示栈
(1)元素"<<'\n';
cout<<"12显示栈
(2)元素"<<'\n';
cout<<"13显示栈
(1)栈顶指针"<<'\n';
cout<<"14显示栈
(2)栈顶指针"<<'\n';
cout<<"15退出"<<'\n';
cout<<"请输入选项:
";
step3输入选项代码
cin>>choice;
step4:
通过选项代码读取选择语句实现具体功能功能实现后未碰到循环结束语句则跳出循环继续执行下一次循环;
switch(choice)
{
case1:
cout<<"请输入插入元素的值:
";
cin>>e;
cout<s.push1(e);
break;
case2:
cout<<"请输入插入元素的值:
";
cin>>e;
cout<s.push2(e);
break;
case3:
e=s.pop1();
cout<<"出栈元素为:
"<break;
case4:
e=s.pop2();
cout<<"出栈元素为:
"<break;
case5:
e=s.GetTop1();
cout<<"栈顶元素为"<break;
case6:
e=s.GetTop2();
cout<<"栈顶元素为"<break;
case7:
s.ClearStack1();
break;
case8:
s.ClearStack2();
break;
case9:
if(s.stackEmpty1())
cout<<"栈
(1)不空"<else
cout<<"栈
(1)空";
break;
case10:
if(s.stackEmpty2())
cout<<"栈
(2)不空"<else
cout<<"栈
(2)空"<break;
case11:
s.stackTranverse1();
break;
case12:
s.stackTranverse2();
break;
case13:
s.stacktop1();
break;
case14:
s.stacktop2();
break;
case15:
cout<<"结束"<default:
cout<<"输入出错请重新输入"<break;
4运行测试
(1)打开程序出现交互界面
(2)输入1入栈1元素
(3)输入2入栈2元素
(4)输入3栈1元素出栈输入4栈2元素出栈
(5)输入11输出栈1元素输入12输出栈2元素
由于之前已经把栈中元素取出故在操作之前我预先输进去了几个数作为栈中元素
栈1:
7322
栈2:
764
(6)输入15结束运行主要功能测试完毕
5调试记录和收获
此程序调试运行数据已经在运行记录中显示此处不在赘述,在程序测试中发现程序在输入过程中每个栈中的元素只能输入一个选项后输入一个数字这种做法在用户操作及使用过程中将会激起不方便,我考虑到可以使用一个循环实现数据一次性多个输入,但是又会出现无限死循环的麻烦,在这里入栈过程中可以加一个输出语句提示输入此次输入数据个数,定义一个指针数组申请一段动态的存储空间,保存将要输入的这组数据,再用循环调用成员函数实现入栈操作