PS:仅数据结构实验记录 题目:设计两个栈 S1、S2 都采用顺序栈方式,并且共享一个存储区[0,MaxLen-1],为了尽量利用空间,减少溢出的可能,可采用栈顶相向、迎面增长的存储方式,如图所示。设计一个有关栈的入栈和出栈算法。
#include<iostream> using namespace std; const int MaxLen = 50; template <typename DataType> class Dou_Stack { public: Dou_Stack(); //构造函数 ~Dou_Stack() {} //析构函数 void En_Stack(DataType x, int i); //入栈操作 DataType De_Stack(); //出栈操作 void Gethead(); //取栈顶元素 private: DataType data[MaxLen]; int top1; int top2; }; template <typename DataType> Dou_Stack<DataType>::Dou_Stack() //构造函数 { top1 = -1; //S1栈顶元素下标 top2 = MaxLen; //S2栈顶元素下标 } template <typename DataType> void Dou_Stack<DataType>::En_Stack(DataType x, int i) //入栈操作 { if (top1 < top2) { if( i == 1 ) data[++top1] = x; else { if (i == 2) data[--top2] = x; else throw "插入位置有误"; } } else throw "插入位置有误"; } template <typename DataType> DataType Dou_Stack<DataType>::De_Stack() //出栈操作 { int i; DataType x; cout << "\n请输入要进行出栈操作的栈(1为S1栈,2为S2栈):"; cin >> i; if (i == 1) { if (top1 == -1) throw "下溢"; else { x = data[top1]; top1--; cout << "S1栈顶元素 " << x << " 出栈成功" << endl; return x; } } else { if (i == 2) { if (top2 == MaxLen) throw "上溢"; else { x = data[top2]; top2++; cout << "S1栈顶元素 " << x << " 出栈成功" << endl; return x; } } else throw "删除位置有误"; } } template <typename DataType> void Dou_Stack<DataType>::Gethead() { if (top1 != -1) { cout << "\n栈S1的栈顶元素为:" << data[top1] ; } else cout << "栈1为空"; cout << endl; if (top2 != -MaxLen) { cout << "栈S2的栈顶元素为:" << data[top2]; } else cout << "栈1为空"; cout << endl; } //测试函数 int main() { Dou_Stack<int> D; int a1[5] = { 1, 3, 5, 7 ,9 }; int a2[5] = { 2 ,4, 6, 8 ,10 }; cout << "将数组a1,a2分别入栈S1,S2:"; try { for (int i = 0; i < 5; i++) { int j = a1[i]; int k = a2[i]; D.En_Stack(j, 1); D.En_Stack(k, 2); } D.Gethead(); D.De_Stack(); D.Gethead(); D.De_Stack(); D.Gethead(); } catch (char* str) { cout << str << endl; } }