设有两个栈s1、s2都采用顺序栈方式,并共享一个存储区[0, ,maxsize-1],为了尽量利用空间,减少溢出的可能,可采用栈顶相向,迎面增长的存储方式。试设计s1、s2有关入栈和出栈的操作方式 -008

设有两个栈s1、s2都采用顺序栈方式,并共享一个存储区[0, ,maxsize-1],为了尽量利用空间,减少溢出的可能,可采用栈顶相向,迎面增长的存储方式。试设计s1、s2有关入栈和出栈的操作方式

总结

算法思路

​ 1、共享栈的定义

​ 2、共享栈两个指针在入栈、出栈时的操作

代码注意点

​ 1、共享栈的定义:数组空间、数组存储的两个栈顶指针

​ 2、exit(0)和return的区别,exit(0)是直接终止进程,return是返回函数调用。

​ 3、return 0:第一个含义一般用在主函数结束时,按照程序开发的一般惯例,表示成功完成本函数。第二个含义表示假,一般用于bool函数返回值。在C++中也可以直接用int,返回值为0时为假。宏定义ERROR 与FLASE一般为0。

​ return 1: 与return 0 的第二个含义相对应,表示真,正确。宏定义TRUE,OK一般为1。

​ return -1: 与return 0 的第一个含义相对应,表示返回一个代数值,一般用在子函数结尾。按照程序开发的一般惯例,表示该函数失败,在数据结构中,一般指**数据溢出(栈只会出现上溢)**,宏定义OVERFLOW 一般为-1。

​ 4、switch每一个case后面都要有break

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
#define maxsize 100
#define ElemType int //定义ElemType为int类型

using namespace std;

typedef struct{
ElemType stack[maxsize];
int top[2]; //top为两个栈顶指针
}stk;

stk s; //s为全局变量

//入栈操作
int push(int i,ElemType x){ //i为栈号,i=0表示左边的s1栈,i=2表示右边的s2栈,x为入栈元素
if(i<0||i>1){
cout<<"输入错误"<<endl;
exit(0); //exit(0)终止程序
}
if(s.top[1]-s.top[0]==1){
cout<<"已满"<<endl;
return 0;
}
switch(i){
case 0: s.stack[++s.top[0]]=x; return 1;break;
case 1: s.stack[--s.top[1]]=x; return 1;break;
}
}


//出栈
ElemType pop(int i){ //i表示栈号
if(i<0||i>1){
cout<<"栈号错误"<<endl;
exit(0);
}
switch(i){
case 0:
if(s.top[0]==-1){
cout<<"栈空"<<endl;
return -1;
}else{
return s.stack[s.top[0]--];
}
break;
case 1:
if(s.top[1]==maxsize){
cout<<"栈空"<<endl;
return -1;
}else{
return s.stack[s.top[1]--];
break;
}
}//switch

}

评论