题目:
用两个栈实现一个队列。
队列的声明如下:请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。
思路:
根据栈的“先进后出”特点,如果将数据导入一个栈,再导入另一个栈,这样数据的出入顺序就变成了“先进先出”,即队列的特点。
假设有两个栈,stack1,stack2.
插入结点:直接压入stack1
删除结点:如果stack2为空,则将stack1中的结点导入stack2,;如果不为空,则从stack2弹出结点。
代码:
#include <iostream>
#include <stack>
#include <exception>
using namespace std;
template<typename T>
class CQueue{
public:
CQueue();
~CQueue();
void appendTail(const T& node);
T deleteHead();
private:
stack<T> stack1;
stack<T> stack2;
};
template<typename T>
void CQueue<T>::appendTail(const T& element){
stack1.push(element);
}
template<typename T>
T CQueue<T>::deleteHead(){
if(stack2.size()<=0){
while(stack1.size()>=0){
T& data=stack1.top();
stack1.pop();
stack2.push(data);
}
}
// if(stack2.size()==0)
// throw new exception("queue is empty");
T head=stack2.top();
stack2.pop();
return head;
}
int main()
{
cout << "Hello world!" << endl;
return 0;
}
在线测试OJ:
http://www.nowcoder.com/books/coding-interviews/54275ddae22f475981afa2244dd448c6?rp=1
AC代码:
class Solution
{
public:
void push(int node) {
stack1.push(node);
}
int pop() {
if(stack2.size()<=0){
int data;
while(stack1.size()>0){
data=stack1.top();
stack1.pop();
stack2.push(data);
}
}
if(stack2.size()<=0)
return -1;
int del=stack2.top();
stack2.pop();
return del;
}
private:
stack<int> stack1;
stack<int> stack2;
};