232.用栈实现队列
思路:实现输入,输出(打印并删除),打印,判断是否空队列。因为是实现先进先出,得用到两个栈,一进一出。输出的时候先判断出的栈是否为空,空就要把进的栈内元素输出到出的栈(PreparePop()),再返回pop或者peek。
C#代码:
public class MyQueue {
Stack<int> stackin;
Stack<int> stackout;
public MyQueue() {
stackin = new Stack<int>();
stackout = new Stack<int>();
}
public void Push(int x) {
stackin.Push(x);
}
public int Pop() {
PreparePop();
return stackout.Pop();
}
public int Peek() {
PreparePop();
return stackout.Peek();
}
public bool Empty() {
return stackin.Count == 0 && stackout.Count == 0;
}
private void PreparePop(){
if(stackout.Count == 0){
while(stackin.Count > 0){
stackout.Push(stackin.Pop());
}
}
}
}
225.用队列实现栈
思路:
由于栈的特点是后进先出,因此使用队列实现栈时,需要维护队列内的元素顺序,使得队首元素是最后入队的元素。使用两个队列实现时,queue1的作用是存储元素,queue2的作用是辅助操作。为了实现栈的功能,需要保证每次入栈操作之后,queue1的队首元素总是新添加的元素。因此入栈操作如下:将待添加的元素入队到 queue2;将 queue1的全部元素依次出队并入队到 queue2;将 queue1和 queue2互换。
完成上述操作后,queue2为空,queue1的队首元素是新添加的元素,queue1内的其余元素和顺序不变。因此上述操作的效果是在 queue1的队首增加了新添加的元素,queue1的队首和队尾分别对应栈顶和栈底。由于每次入栈操作都维护了 queue1内的元素顺序,因此出栈操作和查看栈顶元素操作可以简单实现。出栈操作只需要将 queue1的队首元素移除并返回即可,查看栈顶元素操作只需要返回 queue1的队首元素即可。
C#代码:
public class MyStack {
Queue<int> queue1;
Queue<int> queue2;
public MyStack() {
queue1 = new Queue<int>();
queue2 = new Queue<int>();
}
public void Push(int x) {
queue2.Enqueue(x);
while(queue1.Count > 0){
queue2.Enqueue(queue1.Dequeue());
}
Queue<int> temp = queue1;
queue1 = queue2;
queue2 = temp;
}
public int Pop() {
return queue1.Dequeue();
}
public int Top() {
return queue1.Peek();
}
public bool Empty() {
return queue1.Count == 0;
}
}