1.利用栈来实现队列
//利用栈实现队列 //关键点:利用临时栈将新元素放在原始栈的栈底,从而实现后进后出 #include<iostream> #include<stack> using namespace std; class MyQueue { public: void push(const int& x) { stack<int>temp_stack; //假设_data的元素为[1,2,3,4],1所在位置为栈顶, //要想实现新元素的后进后出,需要将x放在栈底,即[1,2,3,4,x]; //将原栈里的元素次序反转,即此时临时栈temp_stack为[4,3,2,1] //4所在位置为栈顶 while (!_data.empty()) { temp_stack.push(_data.top()); _data.pop(); } //将新元素放在栈顶,此时临时栈temp_stack为[x,4,3,2,1] temp_stack.push(x); //再次反转临时栈里的元素的次序,此时栈_data为[1,2,3,4,x] //新元素x被放在栈底,从而实现了,x后进后出 while (!temp_stack.empty()) { _data.push(temp_stack.top()); temp_stack.pop(); } } int pop() { int x = _data.top(); _data.pop(); return x; } int peek() { return _data.top(); } bool empty() { return _data.empty(); } private: stack<int> _data; }; int main() { MyQueue mq; mq.push(1); mq.push(2); mq.push(3); cout << mq.pop() << endl; mq.push(4); mq.push(5); cout << mq.pop() << endl; }
2.利用队列实现栈
//利用队列实现栈 //关键点:利用临时队列将新元素x放在原始队列头部元素的前面, //进而调用pop()时弹出x,从而实现后进先出 #include<queue> #include<iostream> class MyStack { public: void push(const int &x) { //将data_queue里的所有元素视作一个整体a //临时队列,利用临时队列将新元素x放在a的前面 //重点在于:如何将x插入队列[4,3,2,1]的头部(假设1所在位置为队列头部), //即[4,3,2,1,x](而_data插入x后是[x,4,3,2,1]不能实现x的后进先出)。 std::queue<int> _temp_queue; //将x插入临时队列头部,此时_temp_queue为[x] _temp_queue.push(x); //将_data队列里的元素依次插入_temp_queue,此时_temp_queue为[4,3,2,1,x], //此时,已实现临时队列_temp_queue的x后进先出 while (!_data.empty()) { _temp_queue.push(_data.front()); _data.pop(); } //_temp_queue中的队列元素依次插入_data队列中。此时_data为[4,3,2,1,x] //,pop()时弹出x,实现了队列_data的x后进先出 while (!_temp_queue.empty()) { _data.push(_temp_queue.front()); _temp_queue.pop(); } } int pop() { int x = _data.front(); _data.pop(); return x; } int top() { return _data.front(); } bool empty() { return _data.empty(); } private: std::queue<int> _data;//_data数据队列存储元素的顺序就是栈存储元素的顺序 }; int main() { MyStack ms; ms.push(3); ms.push(4); //while(!ms.empty()) std::cout << ms.pop() << std::endl; ms.push(5); std::cout << ms.pop() << std::endl; }