学习笔记10——用两个队列实现一个栈

题目:用两个队列实现一个栈。栈的声明如下,同学习笔记9类似。请实现它的两个函数appendTail和deleteHead,分别完成在栈中压入一个结点和弹出一个节点的功能。
思路:同笔记9类似,可通过画图形象化理解。元素压入的时候,保持一个队列为空,一个队列不为空,往不为空的队列中插入元素;弹出一个元素e时,从非空队列q1(或q2,后同)入手,将e之前的元素统统插入队列q2并在q1中删除它们,然后删除q1中的元素e,就相当于实现了栈顶元素的弹出。
完整实现代码如下:

#include <iostream>
#include <queue>
#include <exception>
using namespace std;

template <typename T>
class CStack{
public:
	CStack(void);
	~CStack(void);

	// 往栈中压入一个结点
	void appendTail(const T& node);
	// 从栈中弹出一个结点
	T deleteHead();

private:
	queue<T> queue1;
	queue<T> queue2;
};

template <typename T>
CStack<T>::CStack(void){}

template <typename T>
CStack<T>::~CStack(void){}

template <typename T>
void CStack<T>::appendTail(const T& element){ //保持一个队列为空,一个队列不为空,压入元素时,往不为空的队列中压入
	if(!queue1.empty())
		queue1.push(element);
	else
		queue2.push(element);
}

template <typename T>
T CStack<T>::deleteHead(){  //实现栈元素的弹出
	int head = 0;
	if(!queue1.empty()){
		int num = queue1.size();
		while(num > 1){
			queue2.push(queue1.front());
			queue1.pop();
			num--;
		}
		head = queue1.front();
		queue1.pop();
	}
	else{
		int num = queue2.size();
		while(num > 1){
			queue1.push(queue2.front());
			queue2.pop();
			num--;
		}
		head = queue2.front();
		queue2.pop();
	}

	return head;
}

//测试函数
void Test(int actual, int expected){
	if(actual == expected)
		cout << "Test passed." << endl;
	else
		cout << "Test failed." << endl;
}


int main(){
	
	CStack<int> queue;
	queue.appendTail(1);
	queue.appendTail(2);
	queue.appendTail(3);

	int head = queue.deleteHead();
	Test(head, 3);

	queue.appendTail(4);
	head = queue.deleteHead();
	Test(head, 4);

	head = queue.deleteHead();
	Test(head, 2);
	
	head = queue.deleteHead();
	Test(head, 1);
	//本测试用例中,程序运行结果应为4行Test passed.
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值