题目描述:
设有两个栈s1, s2都采用顺序存储方式,并且共享一个存储区域[0, … , maxsize - 1],为了尽量使用空间,减少溢出的可能,可采用栈顶相向,迎面增长的存储方式,请设计s1, s2的出栈,进栈操作算法。
要求:采用空间策略;算法数据结构;写出算法步骤
解题思路:
- 分为左栈和右栈,左栈栈顶指针初始为-1,右栈栈顶指针初始为maxsize
- 共享栈满的条件:top1 + 1 == top2
- 左栈空的条件:top1 == -1
- 右栈空的条件:top2 == maxsize
代码实现:
#include <iostream>
#include <cstring>
using namespace std;
const int MAXSIZE = 100;
class SharedStack {
private:
int leftTop;
int rightTop;
int st[MAXSIZE];
public:
SharedStack() {
this->leftTop = -1;
this->rightTop = MAXSIZE;
memset(st, 0, sizeof(st));
}
bool IsFull() {
return (this->leftTop + 1) == this->rightTop;
}
bool IsLeftEmpty() {
return this->leftTop == -1;
}
bool IsRightEmpty() {
return this->rightTop == MAXSIZE;
}
int GetLeftTop() {
if (!IsLeftEmpty()) {
return st[this->leftTop];
}
return -1;
}
int GetRightTop() {
if (!IsRightEmpty()) {
return st[this->rightTop];
}
return -1;
}
void PushLeft(int x) {
if (IsFull()) {
cout << "the shared stack is full!" << endl;
return;
}
st[++this->leftTop] = x;
}
void PushRight(int x) {
if (IsFull()) {
cout << "the shared stack is full!" << endl;
return;
}
st[--this->rightTop] = x;
}
void PopLeft() {
if (IsLeftEmpty()) {
cout << "empty! can not pop" << endl;
return;
}
--this->leftTop;
}
void PopRight() {
if (IsRightEmpty()) {
cout << "empty! can not pop" << endl;
return;
}
++this->rightTop;
}
};
int main() {
int arr[] = {1, 2, 3, 4, 5};
int n = sizeof(arr) / sizeof(int);
SharedStack sta;
for (int i = 0; i < n; i++) {
sta.PushLeft(arr[i]);
}
while (!sta.IsLeftEmpty()) {
cout << sta.GetLeftTop() << " ";
sta.PopLeft();
}
cout << endl;
SharedStack stb;
for (int i = 0; i < n; i++) {
stb.PushRight(arr[i]);
}
while (!stb.IsRightEmpty()) {
cout << stb.GetRightTop() << " ";
stb.PopRight();
}
cout << endl;
return 0;
}