题目描述
用两个队列实现一个栈,完成栈的Push和Pop操作。
解析
两个队列queue1和queue2
入栈:直接压入queue1
出栈:如果queue1不为空,将queue1中的元素除队尾元素外,其他全部弹出压入queue2中;否则,将queue2中的元素除队尾元素外,其他全面弹出压入queue1中。
实现
#include <iostream>
#include <queue>
using namespace std;
template<typename T > class Mystack{
public:
Mystack();
~Mystack();
void appendTop(const T& val); //入栈
T deleteTop(); //出栈
private:
queue<T> queue1;
queue<T> queue2;
};
template<typename T> Mystack<T>::Mystack(){}
template<typename T> Mystack<T>::~Mystack(){}
template<typename T> void Mystack<T>::appendTop(const T& val){
queue1.push(val);
}
template<typename T> T Mystack<T>::deleteTop(){
T top;
//如果q1不为空,则删除q1的队尾元素,其他元素放入q2中
if(queue1.empty()==false){
while(1){
top = queue1.front();
queue1.pop();
if(queue1.empty()==false)
queue2.push(top);
else return top;
}
}else{ //如果q1为空,则删除q2的队尾元素,其他元素放入q1中
while(1){
top = queue2.front();
queue2.pop();
if(queue2.empty()==false)
queue1.push(top);
else return top;
}
}
}
void Test(char actual, char expected)
{
if(actual == expected)
printf("Test passed.\n");
else
printf("Test failed.\n");
}
int main()
{
Mystack<char> stack;
stack.appendTop('a');
stack.appendTop('b');
stack.appendTop('c');
char head = stack.deleteTop();
Test(head, 'c');
head = stack.deleteTop();
Test(head, 'b');
stack.appendTop('d');
head = stack.deleteTop();
Test(head, 'd');
stack.appendTop('e');
head = stack.deleteTop();
Test(head, 'e');
head = stack.deleteTop();
Test(head, 'a');
system("pause");
return 0;
}