1. 讲解:
两个指针,一个将0作为栈底,一个将maxsize作为栈底,向里面填充。栈满的判断条件为:S.top0 == S.top1 - 1
2. C++代码实现:
#include <stdlib.h> #include <iostream> using namespace std; #define MaxSize 10 #define ElemType int typedef struct { ElemType data[MaxSize]; int top0; int top1; }ShStack; // 初始化栈 void InitStack(ShStack &S) { S.top0 = -1; S.top1 = MaxSize; } // 判断栈空 bool StackEmpty(ShStack S) { if (S.top0 == -1 && S.top1 == MaxSize) return true; else return false; } // 入栈0 bool Push0(ShStack& S, ElemType e) { if (S.top0 == S.top1 - 1) return false; // 如果栈满则失败 S.data[++S.top0] = e; // 栈顶指针加一 return true; } // 入栈1 bool Push1(ShStack& S, ElemType e) { if (S.top0 == S.top1 - 1) return false; // 如果栈满则失败 S.data[--S.top1] = e; // 栈顶指针加一 return true; } // 出栈0 bool Pop0(ShStack& S, ElemType& e) { if (S.top0 == -1) return false; // 如果栈空则失败 e = S.data[S.top0--]; // 栈顶指针减一 return true; } // 出栈1 bool Pop1(ShStack& S, ElemType& e) { if (S.top1 == MaxSize) return false; // 如果栈空则失败 e = S.data[S.top1++]; // 栈顶指针减一 return true; } // 读栈0 bool GetTop0(ShStack& S, ElemType& e) { if (S.top0 == -1) return false; // 如果栈空则失败 e = S.data[S.top0]; // 栈顶指针减一 return true; } // 读栈1 bool GetTop1(ShStack& S, ElemType& e) { if (S.top1 == MaxSize) return false; // 如果栈空则失败 e = S.data[S.top1]; // 栈顶指针减一 return true; } int main() { ShStack S; InitStack(S); // 入栈操作 for (int i = 0; i < 5; ++i) { Push0(S, i); // 向栈0中入栈 Push1(S, i + 5); // 向栈1中入栈 } // 出栈操作 ElemType e; while (Pop0(S, e)) { cout << "Pop from Stack 0: " << e << endl; } while (Pop1(S, e)) { cout << "Pop from Stack 1: " << e << endl; } // 读栈操作 if (GetTop0(S, e)) { cout << "Top element of Stack 0: " << e << endl; } else { cout << "Stack 0 is empty." << endl; } if (GetTop1(S, e)) { cout << "Top element of Stack 1: " << e << endl; } else { cout << "Stack 1 is empty." << endl; } return 0; }