利用栈底位置相对不变的特性,可以让两个顺序栈共享一个空间。
具体实现方法大概有两种:
一种是奇偶栈,就是所有下标为奇数的是一个栈,偶数是另一个栈。但是这样一个栈的最大存储就确定了,并没有起到互补空缺的作用,我们实现了也就没有太大意义。
还有一种就是,栈底分别设在数组的头和尾。进栈往中间进就可以了。这样,整个数组存满了才会真的栈满。
本博客双栈类型结构的规则:
把编号为0和1的2个栈存放于一个空间V[M]之间,栈底分别位于数组两端,当top[0]=-1时,该栈为空,当1号栈的栈顶指针top[1]=m时,栈为空。
2个栈从2端向中间增长。
#include"pch.h"
#include<iostream>
#define maxsize 100
using namespace std;
typedef int elemType;
//编程实现输入n(1<=n <=20)个整数,若是偶数入栈1,否则入栈2。然后栈1中元素依次出栈输出,栈2中的元素依次出栈输出。
typedef struct {
int top[2], bot[2];//栈顶,栈第指针
int m; //栈最大容纳元素个数
//elemType V[maxsize]; //栈数组
elemType *V;
}DblStack;
//1.初始化
bool initDblStack(DblStack &S, int m) {
S.V = new elemType[m];
S.bot[0] = S.top[0] = -1;
S.top[1] = S.bot[1] = m;
S.m = m;
return true;
}
//2.判断栈空
bool isEmpty(DblStack S, int i) {//i号栈
return S.top[i] == S.bot[i];
}
//3.判断栈满
bool isFull(DblStack &S) {
return (S.top[0] + 1) == S.top[1];
}
//4.进栈
bool DPush(DblStack &S, int i, int x) {//指定是i号栈
//先判空
if (S.top[1] - S.top[0] == 1) return false;
if (i == 0)
S.V[++S.top[0]] = x;
else
S.V[--S.top[1]] = x;
return true;
}
//5.出栈
bool DPop(DblStack &S, int i, int x) {
if (S.bot[i] == S.top[i]) {//初始化的状态
return false;
}
else {
if (i == 0)
x = S.V[S.top[0]--];
else
x = S.V[S.top[0]++];
}
cout << x << endl;
return true;
}
//6.show
void show(DblStack s, int i) {
cout << "s" <<i<<":"<< endl;
if (i == 0) {
while (s.top[0] != -1) {//i=0
cout << s.V[s.top[0]--] << " ";
}
}
else {
while (s.top[1] != s.m) {//i=1
cout << s.V[s.top[1]++] << " ";
}
}
cout << endl;
}
int main() {
DblStack s;
int m, m1;
cout << "Input the number " << endl;
cin >> m;
if (initDblStack(s, m))
cout << "init Ok" << endl;
else cout << "failed" << endl;
for (int i = 0; i < m; i++) {
cin >> m1;
DPush(s, m1 % 2, m1);
}
cout << "偶数的部分" << endl;
show(s, 0);
cout << "奇数的部分" << endl;
show(s, 1);
}