day10:栈与队列-232.用栈实现队列、225. 用队列实现栈
LeetCode 232.用栈实现队列
题目链接:
文章讲解:
https://programmercarl.com/0232.%E7%94%A8%E6%A0%88%E5%AE%9E%E7%8E%B0%E9%98%9F%E5%88%97.html
视频讲解:
https://www.bilibili.com/video/BV1nY4y1w7VC/
思路和解法:
因为栈是先入后出,队列是先入先出,所以要想用栈实现队列,也就是用栈模拟队列先入先出的特性,用一个栈是不行的,所以可以考虑以下步骤:
1、定义两个栈,
stack1:专门负责入栈
stack2:专门负责出栈
2、push的时候,只把元素push进stack1。
3、Pop和Peek的时候,让stack1中的元素依次出栈,Pop进stack2中,这样stack2的栈顶元素就是队列的首元素,所以可以直接return stack2.Pop() 或 return stack2.Peek()
public class MyQueue {
Stack<int> stk1;//专门负责入栈
Stack<int> stk2;//专门负责出栈
public MyQueue() {
stk1 = new Stack<int>();
stk2 = new Stack<int>();
}
public void Push(int x) {
stk1.Push(x);
}
public int Pop() {
if(stk2.Count == 0)
{
inToOut();
}
return stk2.Pop();
}
public int Peek() {
if(stk2.Count == 0)
{
inToOut();
}
return stk2.Peek();
}
public bool Empty() {
return stk1.Count == 0 && stk2.Count == 0;
}
public void inToOut()
{
while(stk1.Count > 0)
{
stk2.Push(stk1.Pop());
}
}
}
LeetCode 225. 用队列实现栈
题目链接:
文章讲解:
https://programmercarl.com/0225.%E7%94%A8%E9%98%9F%E5%88%97%E5%AE%9E%E7%8E%B0%E6%A0%88.html
视频讲解:
https://www.bilibili.com/video/BV1Fd4y1K7sm/
思路和解法:
因为队列先入先出,栈是先入后出,所以如果想要用队列实现栈,那么就需要想办法让最后添加进来的元素放在队列的首位,所以可以考虑使用两个队列,思路如下:
1、定义两个队列q1和q2
q1:用于正常存储元素
q2:用于辅助操作
2、每次入栈时,都把元素放到q2中,然后将q1中的元素依次出列并入队到q1,这样就能保证每次添加进来的元素都处于队列的首位。
3、交换q1和q2,这样下次有新元素进来时,仍是先进入q2,再执行以上步骤
4、出栈时只要q1出列就可以
public class MyStack {
Queue<int> q1;
Queue<int> q2;
public MyStack() {
q1 = new Queue<int>();
q2 = new Queue<int>();
}
public void Push(int x) {
q2.Enqueue(x);
while(q1.Count > 0)
{
q2.Enqueue(q1.Dequeue());
}
Queue<int> tmp = q2;
q2 = q1;
q1 = tmp;
}
public int Pop() {
return q1.Dequeue();
}
public int Top() {
return q1.Peek();
}
public bool Empty() {
return q1.Count == 0;
}
}