一、两个队列实现栈结构
定义两个队列,一个队列为存储队列(m_q1),另一个队列为中转队列(m_q2)。入栈时直接压入queue1中,出栈时先将除queue1最后一个元素外依次pop出队列,并压入queue2,将留在queue1中的最后一个元素出队列即为出队元素,之后将queue2中的元素压回queue1中
#include <iostream>
#include <queue>
using namespace std;
class MyStack{
public:
MyStack(){}
MyStack(const MyStack& s){
m_q1 = s.getQueue1();
m_q2 = s.getQueue2();
}
queue<int> getQueue1()const{
return this->m_q1;
}
queue<int> getQueue2()const{
return this->m_q2;
}
void push(int x);
void pop();
int front();
bool empty();
int size();
private:
queue<int> m_q1;
queue<int> m_q2;
};
void MyStack::push(int x){
m_q1.push(x);
}
int MyStack::front(){
return m_q1.back();
}
void MyStack::pop(){
int num = m_q1.size(); //元素总个数
for(int i = 0; i < num - 1; i++){
m_q2.push(m_q1.front());
m_q1.pop();
}
m_q1.pop(); //队列最后一个元素即为栈顶元素(弹出)
num = m_q2.size();
for(int i = 0; i < num; i++){
m_q1.push(m_q2.front());
m_q2.pop();
}
}
bool MyStack::empty(){
return !(m_q1.size() + m_q2.size());
}
int MyStack::size(){
return m_q1.size() + m_q2.size();
}
void test(){
MyStack m_stack;
m_stack.push(1);
m_stack.push(2);
m_stack.push(3);
m_stack.push(4);
m_stack.push(5);
m_stack.push(6);
while(!m_stack.empty()){
std::cout << m_stack.front() << std::endl;
m_stack.pop();
}
}
int main(void){
test();
return 0;
}
二、两个栈实现队列
利用栈先进后出的特性,使用两个栈可以实现队列的pop和push操作
push:往stack1中push元素
pop :先判断stack2是否为空,若为空,将stack1中的所有元素pop至stack2,取出stack2的栈顶元素pop出去;若不为空,直接取出stack2的栈顶元素,pop出去。
#include <iostream>
#include <stack>
using namespace std;
class MyQueue{
public:
MyQueue(){}
MyQueue(const MyQueue& q){
m_s1 = q.m_s1;
m_s2 = q.m_s2;
}
stack<int> getStack1(){
return m_s1;
}
stack<int> getStack2(){
return m_s2;
}
void push(int x);
void pop();
int top();
bool empty();
int size();
private:
stack<int> m_s1;
stack<int> m_s2;
};
void MyQueue::push(int x){
m_s1.push(x);
}
void MyQueue::pop(){
if(m_s2.empty()){
while(!m_s1.empty()){
m_s2.push(m_s1.top());
m_s1.pop();
}
}
m_s2.pop();
}
int MyQueue::top(){
if(m_s2.empty()){
while(!m_s1.empty()){
m_s2.push(m_s1.top());
m_s1.pop();
}
}
return m_s2.top();
}
bool MyQueue::empty(){
return !(m_s1.size() + m_s2.size());
}
int MyQueue::size(){
return m_s1.size() + m_s2.size();
}
void test(){
MyQueue m_queue;
m_queue.push(1);
m_queue.push(2);
m_queue.push(3);
m_queue.push(4);
m_queue.push(5);
m_queue.push(6);
while(!m_queue.empty()){
cout << m_queue.top() << endl;
m_queue.pop();
}
}
int main(void){
test();
return 0;
}