栈与队列(queue and stack)

本文探讨如何使用栈实现队列操作,入队列通过直接插入栈1,达到O(1)的时间复杂度。出队列时,若栈2为空则将栈1元素转移至栈2并弹出栈顶元素,否则直接从栈2弹出栈顶元素,优化了队列操作效率。
摘要由CSDN通过智能技术生成
题目:使用有限个栈实现队列,保证每个队列操作都只需要常数此栈的操作
初看题目感觉似乎单个栈可以在常数次栈操作的情况下实现出队列或者入队列的操作,但是考虑到可以使用多个栈,则可以优化相应的出入队列时间。为此选择两个栈来实现队列。其中一个栈实现入队列操作,另一个栈负责出队列操作,入队列只需要使用栈的push操作即可,但出队列则需要进行一次“倒入”操作,将控制入队列的栈中的元素“倒入”出队列中。如此均摊下来基本上可以实现O(1)时间复杂对的出入队列操作。
算法步骤:
  • 入队列--直接将元素插入栈1中,时间复杂度O(1)。
  • 出队列--如果栈2为空,将栈1中的元素“倒入”栈2中,然后将栈2的栈顶元素取出即可,否则直接取出栈2的栈顶元素
#ifndef MY_QUEUE_H
#define MY_QUEUE_H
#include <stack>
template <class T>
class my_queue
{
public:
	my_queue(){}
	~my_queue(){}
	bool isEmpty() const;
	void enqueue(const T& t){s1.push(t);}
	T dequeue();
private:
	std::stack<T> s1;
	std::stack<T> s2;
};
template<class T>
bool my_queue<T>::isEmpty()const 
{
	if(s1.empty() && s2.empty())
	{
		return true;
	}
	return false;
}
template<class T>
T my_queue<T>::dequeue()
{
	T res;
	if(s2.empty())
	{
		while(!s1.empty())
		{
			s2.push(s1.top());
			s1.pop();
		}
	}
	res = s2.top();
	s2.pop();
	return res;
}
#endif


 
 
 测试代码如下所示: 
#include "my_queue.h"
#include <iostream>
using namespace std;
void main()
{
	my_queue<int> q;
	int item;
	cout<<"Input the item of the queue (exit 0) :";
	cin>>item;
	while(item != 0)
	{
		q.enqueue(item);
		cin>>item;
	}
	while (!q.isEmpty())
	{
		cout<<q.dequeue()<<" ";
	}
	cout<<endl;
}



  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值