用两个队列实现栈和用两个栈实现队列

用两个队列实现栈和用两个栈实现队列

思路

要用两个队列实现栈,就是要实现栈的先进后出,怎么做到用两个队列实现栈的先进后出呢?
队列是先进先出的,每添加一个元素,我们把它放到一个队列的队头就可以了。如果队列是空的,直接添加就可以了,如果不是空的,就需要把这个队列原有的元素移出到另一个队列中,然后添加元素,再把原来移出的元素移回来就可以了。
两个栈实现队列道理是一样的。

两个队列来实现栈
//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();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值