用两个队列实现栈和用两个栈实现队列
思路
要用两个队列实现栈,就是要实现栈的先进后出,怎么做到用两个队列实现栈的先进后出呢?
队列是先进先出的,每添加一个元素,我们把它放到一个队列的队头就可以了。如果队列是空的,直接添加就可以了,如果不是空的,就需要把这个队列原有的元素移出到另一个队列中,然后添加元素,再把原来移出的元素移回来就可以了。
两个栈实现队列道理是一样的。
两个队列来实现栈
//Stack.h
#pragma once
#include "queue"
class Stack
{
public:
Stack();
~Stack();
bool empty();//是否为空
void push(const int& val);//栈顶添加元素
void pop();//删除栈顶元素
int& top();//返回栈顶元素
int size();//返回栈中元素数目
private:
std::queue<int> q1;
std::queue<int> q2;
};
//Stack.cpp
#include "Stack.h"
Stack::Stack()
{
}
Stack::~Stack()
{
}
bool Stack::empty()
{
return q1.empty();
}
void Stack::push(const int& val)
{
//q1中的元素移到q2中
//在添加元素
//再把移出的元素移回,这样添加的元素就是q1的第一个元素了,就实现了栈的先进后出了
while (!q1.empty())
{
q2.push(q1.front());
q1.pop();
}
q1.push(val);
while (!q2.empty())
{
q1.push(q2.front());
q2.pop();
}
}
void Stack::pop()
{
q1.pop();
}
int Stack::size()
{
return q1.size();
}
int& Stack::top()
{
return q1.front();
}
两个栈实现队列
//Queue.h
#pragma once
#include "stack"
class Queue
{
public:
Queue();
~Queue();
bool empty();//是否为空
void pop();//移除第一个元素
void push(const int& val);//在末尾添加元素
int& front();//返回第一个元素
int& back();//返回末尾元素
int size();//队列中元素的个数
private:
std::stack<int> stack;//存放数据
std::stack<int> tempStack;//暂存数据
};
//Queue.cpp
#include "Queue.h"
Queue::Queue()
{
}
Queue::~Queue()
{
}
bool Queue::empty()
{
return stack.empty();
}
void Queue::push(const int& val)
{
//把stack中的元素放到tempStack中
while (!stack.empty())
{
tempStack.push(stack.top());
stack.pop();
}
//添加元素
stack.push(val);
//再把原来移出去的元素添加回来,即把tempStack中的所有元素放到stack中
while (!tempStack.empty())
{
stack.push(tempStack.top());
tempStack.pop();
}
}
void Queue::pop()
{
stack.pop();
}
int& Queue::front()
{
return stack.top();
}
int& Queue::back()
{
int back;//记录最后一个元素
//把所有元素放到tempStack中,队列的末尾元素就是tempStack的栈顶元素
while (!stack.empty())
{
tempStack.push(stack.top());
stack.pop();
}
back = tempStack.top();
//还原stack
while (!tempStack.empty())
{
stack.push(tempStack.top());
tempStack.pop();
}
return back;
}
int Queue::size()
{
return stack.size();
}