题目、用两个栈实现队列
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead, 分别完成在队列尾部插入节点和在队列的首部删除节点的操作.
template <typename T> class CQueue{
public :
CQueue(void);
~CQueue(void);
void append(const T& node);
T deleteHead();
private:
stack<T> stack1;
stack<T> stack2;
}
完整代码
public class StackToQueue {
/*
* 面试题9:用两个栈实现队列
* 题目:用两个栈实现一个队列。队列的声明如下,
* template <typename T> class CQueue{
* public :
* CQueue(void);
* ~CQueue(void);
*
* void append(const T& node);
* T deleteHead();
* private:
* stack<T> stack1;
* stack<T> stack2;
* }
* 请实现它的两个函数appendTail和deleteHead,
* 分别完成在队列尾部插入节点和在队列的首部删除节点的操作
*
* 思路:一个栈压入元素,而另一个栈作为缓冲,将栈1的元素出栈后压入栈2中。
* 也可以将栈1中的最后一个元素直接出栈,而不用压入栈2中再出栈。
* */
static Stack<Integer> stack1 = new Stack<Integer>();
static Stack<Integer> stack2 = new Stack<Integer>();
public static void main(String[] args) {
StackToQueue stackToQueue = new StackToQueue();
stackToQueue.appendTail(1);
stackToQueue.appendTail(2);
stackToQueue.appendTail(3);
stackToQueue.appendTail(4);
System.out.println("栈1原始内容:"+ stack1);
System.out.println("栈2原始内容:"+ stack2);
stackToQueue.deleteHead();
System.out.println("栈1修改后内容:"+ stack1);
System.out.println("栈2修改后内容:"+ stack2);
stackToQueue.deleteHead();
System.out.println("栈1修改后内容:"+ stack1);
System.out.println("栈2修改后内容:"+ stack2);
}
//进栈,完成队列尾部插入元素
public void appendTail(int i){
stack1.push(i);
}
//出栈,完成队列尾部删除元素
public void deleteHead(){
if(stack1.isEmpty() && stack2.isEmpty()){
System.out.println("栈为空!");
}
/**
* 若栈2为空,则将栈1的元素出栈并压到栈2
* 弹出栈2的栈顶元素即可
*/
if(stack2.isEmpty()){
while(!stack1.isEmpty()){
stack2.push(stack1.pop());
}
}
/**
* 若栈2不为空,直接弹出栈2的栈定元素
*/
stack2.pop();
}
}