18_225. 用队列实现栈
题目描述:
解题思路:
- 用两个队列:一个用来当做栈,一个用来当做辅助队列,队列用来维持当做栈的那个原有的顺序,因此可以先把当前元素进入到辅助队列、然后把栈那个元素按顺序取出来放到辅助队列,这样辅助队列就成了新的栈,交换两个队列即可。
- 一个队列:在入栈之前,先记录此时栈中元素的个数n,然后将当前元素入队列,再依次把n个元素取出来,依次放到队列尾即可。
代码:
两个队列
//两个队列:
class MyStack {
Queue queue1;
Queue queue2;
public MyStack() {
queue1 = new LinkedList();//当作栈,队头当做栈顶
queue2 = new LinkedList();//辅助队列,用来维持栈中元素,现有的顺序
}
public void push(int x) {
queue2.offer(x);
while (!queue1.isEmpty()) {
queue2.offer(queue1.poll());
}
Queue temp = queue1;
queue1 = queue2;
queue2 = temp;
}
public int pop() {
return queue1.poll();
}
public int top() {
return queue1.peek();
}
public boolean empty() {
return queue1.isEmpty();
}
}
/**
* 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();
*/
一个队列
//一个队列:
class MyStack {
//队列,可以维持元素的顺序
Queue queue;//使用一个队列当做栈,记录在push之前元素的个数n,在push之后,依次取出该队列中的n个元素,然后依次添加到队列尾
public MyStack() {
queue = new LinkedList();//当作栈,队头当做栈顶
}
public void push(int x) {
int size = queue.size();
queue.offer(x);
for (int i = 0; i < size; i++) {
queue.offer(queue.poll());
}
}
public int pop() {
return queue.poll();
}
public int top() {
return queue.peek();
}
public boolean empty() {
return queue.isEmpty();
}
}
/**
* 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();
*/