栈与队列理论知识
队列是先进先出,栈是先进后出
栈实现队列
思路
使用栈实现队列的一系列操作:放进去,拿出来,第一个元素,是否为空
因为栈只能单入单出,所以用两个出口相反的栈可以等效成一个队列。
输入数据时,直接放进输入栈就可以;
输出数据时,需要先判断输出栈是否为空,优先输出输出栈的元素,如果输出栈为空,则需先把输入栈的元素全部导入输出栈,再从输出栈导出元素;
判断队列为空需要判断输入栈和输出栈两个栈是否为空;
取首位元素,和输出数据功能类似,但是不用取出来。
代码
class MyQueue {
Stack<Integer> stackIn;
Stack<Integer> stackOut;
/** Initialize your data structure here. */
public MyQueue() {
stackIn = new Stack<>(); // 负责进栈
stackOut = new Stack<>(); // 负责出栈
}
/** Push element x to the back of queue. */
public void push(int x) {
stackIn.push(x);
}
/** Removes the element from in front of queue and returns that element. */
public int pop() {
dumpstackIn();
return stackOut.pop();
}
/** Get the front element. */
public int peek() {
dumpstackIn();
return stackOut.peek();
}
/** Returns whether the queue is empty. */
public boolean empty() {
return stackIn.isEmpty() && stackOut.isEmpty();
}
// 如果stackOut为空,那么将stackIn中的元素全部放到stackOut中
private void dumpstackIn(){
if (!stackOut.isEmpty()) return;
while (!stackIn.isEmpty()){
stackOut.push(stackIn.pop());
}
}
}
队列实现栈
思路
每offer一个数a进来,都重新排列,把数a放在队列的队首,那可以不动a,把除了a其他的数出去重新进来。
代码
class MyStack {
Queue<Integer>queue;
public MyStack() {
queue = new LinkedList<>();
}
public void push(int x) {
queue.offer(x);
int size=queue.size();
while(size-->1)
queue.offer(queue.poll());
}
public int pop() {
return queue.poll();
}
public int top() {
return queue.peek();
}
public boolean empty() {
return queue.isEmpty();
}
}