版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/abc15766228491/article/details/82560188
题目描述
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
栈的特点:先入后出,队列的特点:先入先出,可以用两个栈,在入队列的时候,先入第一个栈,出队列的时候,应该出的是栈尾的元素,因此将第一个栈的元素全部放入第二个栈内(前提是第二个栈为空)然后将第二个栈的栈顶元素就是第一个栈的栈底元素,弹出第二个栈的栈顶元素即可。
class Solution
{
public:
void push(int node) {
stack1.push(node);
}
int pop() {
if(stack2.size()<=0){
while(stack1.size()>0){
int& data = stack1.top();
stack2.push(data);
stack1.pop();
}
}
int& head = stack2.top();
stack2.pop();
return head;
}
private:
stack<int> stack1;
stack<int> stack2;
};
两个队列实现栈:先检测两个队列那个为空,在不为空的那个队列后面添加(如果两个都为空,就加第一个)要弹出栈顶的元素,也就是要弹出队列尾的元素,就把一个不为空的队列除了最后一个元素都添加到另一个队列中,然后弹出那个不为空的队列中的唯一一个值,就是原来的那个队列中的最后一个值了
#include <iostream>
#include <queue>
using namespace std;
template <typename T> class Cstack{
public:
void append(const T&node);
T deleteHead();
size_t sizes();
private:
queue<T> queue1;
queue<T> queue2;
};
template <typename T> void Cstack<T>::append(const T &node) {
if(queue2.size()<=0){
queue1.push(node);
}
else queue2.push(node);
}
template <typename T> T Cstack<T>::deleteHead() {
T result;
if(queue2.size()<=0){
while (queue1.size()>1){
T &data = queue1.front();
queue2.push(data);
queue1.pop();
}
result = queue1.front();
queue1.pop();
}
else{
while(queue2.size()>1){
T &data = queue2.front();
queue1.push(data);
queue2.pop();
}
result = queue2.front();
queue2.pop();
}
return result;
}
template <typename T> size_t Cstack<T>::sizes() {
if(queue2.size()!=0) return queue2.size();
else return queue1.size();
}
int main()
{
Cstack<int> C_test;
for (int i = 0; i < 10; ++i) {
C_test.append(i);
}
int lens = C_test.sizes();
for (int k = 0; k < lens; ++k) {
int result = C_test.deleteHead();
cout<<result<<" ";
}
}