请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):
实现 MyQueue 类:
void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int peek() 返回队列开头的元素boolean empty() 如果队列为空,返回 true ;否则,返回 false说明:
push to top, peek/pop from top, size, 和 is empty 操作是合法的。- class MyQueue {
- Stack
stack1; //必须在类中声明成员变量 - Stack
stack2; //然后在构造方法中 初始化!!! -
- public MyQueue() {
- stack1 = new Stack<>();
- stack2 = new Stack<>();
- }
-
- public void push(int x) {
- stack1.push(x);
- }
-
- public int pop() {
- if(!stack2.empty()) {
- return stack2.pop();
- }
- while(!stack1.empty()) {
- stack2.push(stack1.pop());
- }
- return stack2.pop();
- }
-
- public int peek() {
- if(!stack2.empty()) {
- return stack2.peek();
- }
- while(!stack1.empty()) {
- stack2.push(stack1.pop());
- }
- return stack2.peek();
- }
-
- public boolean empty() {
- return (stack1.empty() && stack2.empty());
- }
- }
此题我犯了一个天大的错误,竟然在构造方法里声明stack1和stack2。在方法中的局部变量怎么能给其他方法提供使用呢!!! 应该在类中声明成员变量,然后在构造方法初始化!构造方法不就是用来初始化的吗!
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。
实现 MyStack 类:
void push(int x) 将元素 x 压入栈顶。int pop() 移除并返回栈顶元素。int top() 返回栈顶元素。boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。注意:
push to back、peek/pop from front、size 和 is empty 这些操作。- class MyStack {
- Queue
queue1; - Queue
queue2; -
- public MyStack() {
- queue1 = new LinkedList<>();
- queue2 = new LinkedList<>();
- }
-
- public void push(int x) {
- if(queue1.isEmpty()){
- queue2.add(x);
- } else {
- queue1.add(x);
- }
- }
-
- public int pop() {
- int res = 0;
- if(queue1.isEmpty()){
- while(!queue2.isEmpty()) {
- res = queue2.remove();
- if(!queue2.isEmpty()) queue1.add(res);
- }
- } else {
- while(!queue1.isEmpty()) {
- res = queue1.remove();
- if(!queue1.isEmpty()) queue2.add(res);
- }
- }
- return res;
- }
-
- public int top() {
- int res = 0;
- if(queue1.isEmpty()){
- while(!queue2.isEmpty()) {
- res = queue2.remove();
- queue1.add(res);
- }
- } else {
- while(!queue1.isEmpty()) {
- res = queue1.remove();
- queue2.add(res);
- }
- }
- return res;
- }
-
- public boolean empty() {
- return (queue1.isEmpty() && queue2.isEmpty());
- }
-
- }
这个思路不难,问题的核心就是如何找到最后一个元素。就是两个队列哪个空就把元素都放到空的那个 然后知道走到最后一个元素。
- class MyStack {
- Queue
queue; -
- public MyStack() {
- queue = new LinkedList<>();
- }
-
- public void push(int x) {
- queue.add(x);
- int size = queue.size();
- while(size != 1) {
- queue.add(queue.remove());
- size--;
- }
- }
-
- public int pop() {
- return queue.remove();
- }
-
- public int top() {
- return queue.peek();
- }
-
- public boolean empty() {
- return queue.isEmpty();
- }
-
- }
使用一个队列实现栈,就是每次push时将队列中所有元素,都remove再add 使得添加的元素为首元素。以此类推所有的元素都是倒序排列的 也就是栈!