队列实现栈&栈实现队列

一、两个队列实现栈结构

定义两个队列,一个队列为存储队列(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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Star星屹程序设计

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值