目录
理论基础
栈(stack)是限定仅在表尾进行插入或删除操作的线性表。
因此,对于栈来说,表尾端称为栈顶(top),相应地,表头端称为栈底(buttom)。
不含元素的栈称为空栈。
栈的修改是按照后进先出的原则进行的,因此,栈又被称为后进先出(Last In First Out)的线性表。
队列(queue)是一种先进先出(First In First Out,FIFO)的线性表。它只允许在表的一端进行插入,而在另一端删除元素。
在队列中,允许插入的一端称为队尾(rear),允许删除的一端则为队头(front)。
LeetCode 232. 用栈实现队列
文章讲解:代码随想录
视频讲解:栈的基本操作! | LeetCode:232.用栈实现队列_哔哩哔哩_bilibili
力扣题目:LeetCode 232. 用栈实现队列
思路:我们知道栈特点为LIFO,那么用栈实现队列(FIFO)的时候,就需要两个栈,一个作为输入栈,一个作为输出栈。这里我们需要特别注意几个地方,要保证按照先进先出的结果输出,正常流程就是先把输入栈的元素全部push到输出栈中(这里就有点像左旋转字符串的思想,先部分反转,然后再整体反转从而到达左旋的目的),然后再从输出栈中进行pop操作,这样就可以保证先进先出的结果输出。在从输入栈中push到输出栈的这个过程中,我们需要判断输出栈是否还有元素,如果有,则pop输出栈中的元素,否则就直接push到输出栈中。
代码如下:
class MyQueue {
Stack<Integer> stackIn;
Stack<Integer> stackOut;
public MyQueue() {
stackIn = new Stack<>();
stackOut = new Stack<>();
}
public void push(int x) {
stackIn.push(x);
}
public int pop() {
dumpstackIn();
return stackOut.pop();
}
public int peek() {
dumpstackIn();
return stackOut.peek();
}
public boolean empty() {
return stackIn.isEmpty() && stackOut.isEmpty();
}
private void dumpstackIn(){
if(!stackOut.isEmpty()){
return;
}
while(!stackIn.isEmpty()){
stackOut.push(stackIn.pop());
}
}
}
/**
* Your MyQueue object will be instantiated and called as such:
* MyQueue obj = new MyQueue();
* obj.push(x);
* int param_2 = obj.pop();
* int param_3 = obj.peek();
* boolean param_4 = obj.empty();
*/
LeetCode 225. 用队列实现栈
文章讲解:代码随想录
视频讲解:队列的基本操作! | LeetCode:225. 用队列实现栈_哔哩哔哩_bilibili
力扣题目:LeetCode 225. 用队列实现栈
思路讲解:用一个队列来实现栈,我们首先定位到要pop出去的元素,也就是先pop操作,然后把pop出去的元素重新添加到队列当中,一直循环到需要pop的元素为止。不断进行这样的操作就可以实现用队列实现栈。
代码如下:
class MyStack {
Queue<Integer> queue;
public MyStack() {
queue = new LinkedList<>();
}
public void push(int x) {
queue.add(x);
}
public int pop() {
rePosition();
return queue.poll();
}
public int top() {
rePosition();
int result = queue.poll();
queue.add(result);
return result;
}
public boolean empty() {
return queue.isEmpty();
}
public void rePosition(){
int size = queue.size();
size--;
while(size-->0){
queue.add(queue.poll());
}
}
}
/**
* Your MyStack object will be instantiated and called as such:
* MyStack obj = new MyStack();
* obj.push(x);
* int param_2 = obj.pop();
* int param_3 = obj.top();
* boolean param_4 = obj.empty();
*/