代码随想录算法训练营第十天|232.用栈实现队列、225.用队列实现栈、20.有效的括号
232.用栈实现队列
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):
实现 MyQueue 类:
void push(int x) 将元素 x 推到队列的末尾
int pop() 从队列的开头移除并返回元素
int peek() 返回队列开头的元素
boolean empty() 如果队列为空,返回 true ;否则,返回 false
题解:栈先进后出,队列先进先出。
代码:
java
class MyQueue {
//入栈
Stack<Integer> s1;
//出栈
Stack<Integer> s2;
public MyQueue() {
//初始化
s1=new Stack<>();
s2=new Stack<>();
}
public void push(int x) {
s1.push(x);
}
public int pop() {
change();
return s2.pop();
}
public int peek() {
change();
return s2.peek();
}
public boolean empty() {
if(s2.isEmpty() && s1.isEmpty()){
return true;
}
return false;
}
public void change(){
if(!s2.isEmpty()) return ;
while(!s1.isEmpty()){
s2.push(s1.pop());
}
}
}
225.用队列实现栈
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。
实现 MyStack 类:
void push(int x) 将元素 x 压入栈顶。
int pop() 移除并返回栈顶元素。
int top() 返回栈顶元素。
boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。
题解 :双端队列。
代码:
java
class MyStack {
Deque<Integer> de;
public MyStack() {
de=new ArrayDeque<>();
}
public void push(int x) {
de.add(x);
}
public int pop() {
return de.pollLast();
}
public int top() {
return de.peekLast();
}
public boolean empty() {
return de.isEmpty();
}
}
20.有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = "()"
输出:true
题解:用栈实现。遇到左括号将对应的有括号加到栈中,遇到有括号时匹配。
代码:
java
class Solution {
public boolean isValid(String s) {
char ch;
Stack<Character> st=new Stack<>();
for(int i=0;i<s.length();i++){
ch=s.charAt(i);
if(ch=='('){
st.push(')');
}else if(ch=='['){
st.push(']');
}else if(ch=='{'){
st.push('}');
}else if(st.isEmpty() || st.peek()!=ch){ //右括号的情况
return false;
}else{
st.pop();
}
}
return st.isEmpty();
}
}