225、用队列实现栈 232、用栈实现队列

225、使用队列实现栈的下列操作:

  • push(x) -- 元素 x 入栈
  • pop() -- 移除栈顶元素
  • top() -- 获取栈顶元素
  • empty() -- 返回栈是否为空

注意:

  • 你只能使用队列的基本操作-- 也就是 push to back, peek/pop from front, size, 和 is empty 这些操作是合法的。
  • 你所使用的语言也许不支持队列。 你可以使用 list 或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。
  • 你可以假设所有操作都是有效的(例如, 对一个空的栈不会调用 pop 或者 top 操作)。

思路:将新入栈的元素放在临时队列里,临时队列放在数据队列最前面,实现后进先出功能

class MyStack {
       /** Initialize your data structure here. */
   Queue dataQueue;
   Queue tempQueue;
   public MyStack() {
	   dataQueue=new LinkedList<>();
	   tempQueue=new LinkedList<>();
   }
   
   /** Push element x onto stack. */
   public void push(int x) {
	   tempQueue=dataQueue;
	   dataQueue=new LinkedList<>();
	   dataQueue.offer(x);
	   while(!tempQueue.isEmpty())
		   dataQueue.offer(tempQueue.poll());
	   }
	   
   
   /** Removes the element on top of the stack and returns that element. */
   public int pop() {
	   return dataQueue.poll();
   }
   
   /** Get the top element. */
   public int top() {
	   return dataQueue.peek();
   }
   
   /** Returns whether the stack is empty. */
   public boolean empty() {
	   return dataQueue.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();
 */

 

232、使用栈实现队列的下列操作:

  • push(x) -- 将一个元素放入队列的尾部。
  • pop() -- 从队列首部移除元素。
  • peek() -- 返回队列首部的元素。
  • empty() -- 返回队列是否为空。

示例:

MyQueue queue = new MyQueue();

queue.push(1);
queue.push(2);  
queue.peek();  // 返回 1
queue.pop();   // 返回 1
queue.empty(); // 返回 false

说明:

  • 你只能使用标准的栈操作 -- 也就是只有 push to toppeek/pop from topsize, 和 is empty 操作是合法的。
  • 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
  • 假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)。

 思路:将数据栈中元素导入到临时栈中实现掉序,在临时栈中加入新元素,将临时栈中元素返回到数据栈

225、用队列实现栈 232、用栈实现队列_第1张图片

class MyQueue {
	    /** Initialize your data structure here. */
	    Stack dataStack;
	    Stack tempStack;
	    public MyQueue() {
	        dataStack=new Stack<>();
	        tempStack=new Stack<>();
	    }
	    
	    /** Push element x to the back of queue. */
	    public void push(int x) {
	    	while(!dataStack.isEmpty()) {
	    		tempStack.push(dataStack.pop());
	    	}
	    	tempStack.push(x);
	    	while(!tempStack.isEmpty()) {
	    		dataStack.push(tempStack.pop());
	    	}
	    }
	    
	    /** Removes the element from in front of queue and returns that element. */
	    public int pop() {
	    	if(dataStack.isEmpty())
	    		return -1;
	    	return dataStack.pop();
	    }
	    
	    /** Get the front element. */
	    public int peek() {
	    	if(dataStack.isEmpty())
	    		return -1;
	    	return dataStack.peek();
	    }
	    
	    /** Returns whether the queue is empty. */
	    public boolean empty() {
	    	return dataStack.isEmpty();
	    }
	}
/**
 * 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();
 */

 

你可能感兴趣的:(算法)