两个队列模拟一个栈行为;
两个队列q1,q2,队列构造函数默认构造两个空队列。
将元素入队到q1中,经过一系列入队操作,q1非空,含有n个元素,q2为空队;
将q1中元素依次出队并入队q2,直至只剩下一个元素, 即q1出队n-1个元素,并依次入队到q2中。
此时,q1中仅剩的唯一一个元素,是期初队列最后入队的元素,将该元素删除(pop),就模拟完成了栈的栈顶元素出栈;在删除之前取出该元素,就模拟完成了取栈顶元素 ,这和栈的后进先出一致
此时,q1,为空,q2非空,接下来要做的就是循环的对非空队列入队,取最后一个元素
//两个队列模拟栈 class SimulateStack { public: SimulateStack(){ count = 0;} ~SimulateStack(){ } void simPush(int); //模拟入栈 void simPop(); //模拟出栈 int simTop();//取栈顶元素 int simSize();//计算栈元素个数; bool simEmpty(); private: queue<int> q1; queue<int> q2; int count; }; //入栈 inline void SimulateStack::simPush(int num) { if (!q1.empty()) { q1.push(num); } else q2.push(num); count++; } //出栈 inline void SimulateStack::simPop() { //int tmp; if (!q1.empty()) { while (q1.size()!=1) { q2.push(q1.front()); q1.pop(); } //tmp = q1.front(); q1.pop(); } else if (!q2.empty()) { while (q2.size()!=1) { q1.push(q2.front()); q2.pop(); } //tmp = q2.front(); q2.pop(); } --count; } //取栈顶元素 inline int SimulateStack::simTop() { int tmp; if (!q1.empty()) { tmp = q1.back(); } else { if (!q2.empty()) { tmp = q2.back(); } } return tmp; } inline int SimulateStack::simSize() { return count; } inline bool SimulateStack::simEmpty() { return (count == 0); } int main() { SimulateStack st; st.simPush(1); st.simPush(2); st.simPush(3); st.simPush(4); st.simPush(5);
int st_size = st.simSize(); cout << "stack size: "<<st_size<<endl; //栈顶元素为5, cout << "top element: " << st.simTop(); //5出栈 st.simPop(); cout <<endl; //此时栈顶元素为4,取栈顶元素 cout <<"current top element:" << st.simTop() <<endl;
}
结果输出,取栈顶元素5,然后5出栈,此时栈顶元素为4,符合后进先出原则;