// 题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail | |
// 和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。 |
牛客AC代码:
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
class Solution
{
public:
void push(int node) {
stack1.push(node);
}
int pop() {
if(stack2.empty()){
while(!stack1.empty()){
stack2.push(stack1.top());
stack1.pop();
}
}
if(stack2.empty()){
try{
throw "队列为空!";
}
catch(char const *s){
cout<<"出现异常: "<<s<<endl;
return -1;
}
}
int value = stack2.top();
stack2.pop();
return value;
}
private:
stack<int> stack1;
stack<int> stack2;
};
完整代码实现如下:
#include<iostream>
#include<stack>
#include<exception>
//#include<queue>
using namespace std;
template<typename T> //或者用template<class T>
class CQueue{
public:
CQueue(void);
~CQueue(void);
void appendTail(const T &node);
T deleteHead();
private:
stack<T> stack1;
stack<T> stack2;
};
template<typename T> CQueue<T>::CQueue(void){
}
template<typename T> CQueue<T>::~CQueue(void){
}
template<typename T>
void CQueue<T>::appendTail(const T &node){ //注意类名后要加<T>
stack1.push(node);
}
template<typename T>
T CQueue<T>::deleteHead(){
T res;
if(!stack2.empty()){
res = stack2.top();//只能通过top()读取后再删除,pop()删除方法不会返回删除值
stack2.pop();
return res;
}
else{
while(!stack1.empty()){
stack2.push(stack1.top());
stack1.pop();
}
if(stack2.empty()){
try{
throw "队列为空!";
}
catch(char const *s){
cout<<"出现异常: "<<s<<endl;
return res;
}
}
res = stack2.top();
stack2.pop();
return res;
}
}
int main(){
/*
queue<int> myqueue;
myqueue.push(4);
myqueue.push(10);
cout<<myqueue.front()<<endl;//读第一个元素
cout<<myqueue.back()<<endl;//读最后一个元素
*/
CQueue<int> myQueue;
myQueue.appendTail(10);
myQueue.appendTail(8);
myQueue.appendTail(7);
myQueue.appendTail(6);
cout<<myQueue.deleteHead()<<endl;
cout<<myQueue.deleteHead()<<endl;
myQueue.appendTail(23);
myQueue.appendTail(13);
cout<<myQueue.deleteHead()<<endl;
cout<<myQueue.deleteHead()<<endl;
cout<<myQueue.deleteHead()<<endl;
cout<<myQueue.deleteHead()<<endl;
cout<<myQueue.deleteHead()<<endl;
return 0;
}
运行结果如下: