232.用栈实现队列
思路
有两个栈,当需要弹栈的时候把第一个栈的元素放到第二个栈中,这样第二个栈的栈顶就是原来第一个栈的栈底,把第二个栈栈顶元素弹出即可。后面再加元素的时候往第一个栈加,不影响我弹栈的时候弹第二个栈(已经顺序了),当第二个栈空了以后,再将第一个栈的元素压入第二个栈
代码
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() {
inToOut();
return stackOut.pop();
}
public int peek() {
inToOut();
return stackOut.peek();
}
public boolean empty() {
if(stackIn.isEmpty()&&stackOut.isEmpty()) return true;
return false;
}
public void inToOut(){
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();
*/
225. 用队列实现栈
思路
用两个队列,一个是模拟栈的队列,一个是辅助队列。将要加入的元素先放进辅助队列,然后再将模拟栈的队列的元素移到辅助队列上,这样就能保持加入的最新的元素是在队头(即栈顶),然后此时模拟栈的队列为空,将模拟栈的队列和辅助队列交换(如果要保持加入的元素出现在队头,那个队列就得是空的),模拟栈的队列的队头出队。
代码
class MyStack {
Queue<Integer> queueStack;
Queue<Integer> queueHelp;
public MyStack() {
queueStack = new LinkedList<>();
queueHelp = new LinkedList<>();
}
public void push(int x) {
queueHelp.offer(x);
while(!queueStack.isEmpty()){
queueHelp.offer(queueStack.poll());
}
Queue<Integer> temp=queueStack;
queueStack=queueHelp;
queueHelp=temp;
}
public int pop() {
return queueStack.poll();
}
public int top() {
return queueStack.peek();
}
public boolean empty() {
if(queueStack.isEmpty()) return true;
return false;
}
}
/**
* 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();
*/
20. 有效的括号
思路
栈相关的经典题
代码
class Solution {
public boolean isValid(String s) {
Stack<Character> stack=new Stack<>();
for(int i=0;i<s.length();i++){
char c=s.charAt(i);
if(c=='('||c=='{'||c=='['){
stack.push(c);
}else{
if(stack.isEmpty()) return false;
if(c==')'&&stack.pop()!='('||
c=='}'&&stack.pop()!='{'||
c==']'&&stack.pop()!='[')
return false;
}
}
if(!stack.isEmpty()) return false;
return true;
}
}
1047. 删除字符串中的所有相邻重复项
思路
栈相关的经典题
代码
class Solution {
public String removeDuplicates(String s) {
Stack<Character> stack=new Stack<>();
for(int i=s.length()-1;i>=0;i--){
char c=s.charAt(i);
if(!stack.isEmpty()){
if(c==stack.peek()){
stack.pop();
}else{
stack.push(c);
}
}else{
stack.push(c);
}
}
String result="";
while(!stack.isEmpty()){
result+=stack.pop();
}
return result;
}
}