程序员面试金典: 9.3栈与队列 3.5实现一个MyQueue类,该类用两个栈来实现一个队列

来源:互联网 发布:linux 安装配置oracle 编辑:程序博客网 时间:2024/06/15 17:37
#include <iostream>#include <stdio.h>#include <stack>#include <string>using namespace std;/*问题:实现一个MyQueue类,该类用两个栈来实现一个队列分析:设两个栈分别为栈1和栈2.栈1负责压入,栈2负责弹出。一个例子:假设压入1,2,3,然后弹出1,压入4,。模拟过程:栈1:321栈2:空然后需要弹出1,此时需要将栈1所有元素压入栈2,此时栈1为空,栈2为123然后弹出1,栈2变为:23当需要压入4时,肯定不能直接压入到栈2,因为此时顺序不对,因此只能将栈2元素都压入栈1,然后将4也压入栈1,变成432总结规律:栈1用于压入,当需要压入元素时,判断此时如果栈1为空,需要将栈2的所有元素先压入栈1,然后再压入当前元素栈2用于弹出,当需要弹出元素时,判断此时如果栈2为空,需要将栈1的所有元素压入栈2,然后弹出栈2的栈顶元素输入:3(压入栈的元素个数)1 2 3(栈中的每个元素)2(指令个数)pop 1(pop弹出的次数)push 4(push压入的元素)输出:2 3 4(输出两个栈组成的队列中所有元素,按先后顺序)关键:1 栈1用于压入,当需要压入元素时,判断此时如果栈1为空,需要将栈2的所有元素先压入栈1,然后再压入当前元素栈2用于弹出,当需要弹出元素时,判断此时如果栈2为空,需要将栈1的所有元素压入栈2,然后弹出栈2的栈顶元素*/class MyQueue{public:void push(int value){//如果弹出栈不空,将该栈所有元素压入压入栈中,然后再执行压入if( !popStack.empty() ){while( !popStack.empty() ){int num = popStack.top();popStack.pop();pushStack.push(num);}pushStack.push(value);}//如果弹出栈为空,直接压入元素else{pushStack.push(value);}}void pop(){//如果压入栈不空,将压入栈中所有元素转移至弹出栈中,然后弹出if(!pushStack.empty()){while(!pushStack.empty()){int num = pushStack.top();pushStack.pop();popStack.push(num);}popStack.pop();}else{popStack.pop();}}//打印元素时,此时需要判断所有元素在哪个栈中。全部转移至弹出栈中,然后输出,就是正确顺序void print(){if(!pushStack.empty()){while(!pushStack.empty()){int num = pushStack.top();pushStack.pop();popStack.push(num);}}//弹出元素stack<int> tempStack( popStack );while(!tempStack.empty()){int value = tempStack.top();tempStack.pop();cout << value << " ";}cout << endl;}private:stack<int> pushStack;stack<int> popStack;};int main(int argc, char* argv[]){int n;int commandNum;int value;string command;while(cin >> n){int* pArr = new int[n];MyQueue myQueue;for(int i = 0 ; i < n ; i++){cin >> *(pArr + i) ;myQueue.push( *(pArr + i) );}cin >> commandNum;for(int j = 0 ; j < commandNum ; j++){cin >> command >> value;if(command == "pop"){for(int k = 0 ; k < value ; k++){myQueue.pop();}}else if(command == "push"){myQueue.push(value);}}myQueue.print();delete[] pArr;}getchar();return 0;}

0 0
原创粉丝点击