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() {
dumpStackIn();
return stackOut.pop();
}
public int peek() {
dumpStackIn();
return stackOut.peek();
}
public boolean empty() {
return stackIn.isEmpty() && stackOut.isEmpty();
}
//如果stackOut为空的话,那么将stackIn中的元素全部放到satckOut中
private void dumpStackIn() {
if (!stackOut.isEmpty()) return; //如果出的栈不为空
while (!stackIn.empty()) {
stackOut.push(stackIn.pop()); //如果入的栈不为空,将该栈内的元素转移到出的栈中
}
}
}
225. 用队列实现栈
class MyStack {
// 用队列实现栈
Deque<Integer> que1; //new了一个队列
public MyStack() {
que1 = new ArrayDeque<>();
}
//void push(int x) 将元素 x 压入栈顶。
public void push(int x) {
que1.addLast(x);
}
//移除并返回栈顶元素。
public int pop() {
//移除栈顶元素
int size = que1.size();
size--;
while (size-- > 0) {
que1.addLast(que1.peekFirst()); //提取队列第一个元素添加到该队列末尾
que1.pollFirst(); //将队列第一个元素从队列中移除
}
//返回栈顶元素
int res = que1.pollFirst();
return res;
}
//int pop() 移除并返回栈顶元素。
public int top() {
return que1.peekLast(); //peekLast()返回队列的最后一个元素
}
public boolean empty() {
return que1.isEmpty();
}
}
20、有效的括号
思路:
考虑三种情况 :
①左括号多了–>栈为空
②左括号类型不匹配–>与栈顶元素不匹配
③右括号多–>栈为空
Tips:由于栈结构的特殊性,非常适合解决对称匹配类型的问题。
Deque<Character> deque = new LinkedList<>(); //定义一个栈存放匹配的括号
char ch; //从字符串中取值
for (int i = 0; i < s.length(); i++) {
ch = s.charAt(i);
//遇见 ( [ { ,将其对应的有括号放入栈
if (ch == '(') {
deque.push(')');
} else if (ch == '[') {
deque.push(']');
} else if (ch == '{') {
deque.push('}');
//1、字符串中是左括号的情况 ,字符串无效的情况 1、栈中的元素和字符串的元素不匹配 2、左边的括号多
} else if (deque.isEmpty() || deque.peek() != ch) {
return false; //字符串无效
//2、字符串中是右括号的情况:如果在字符串中遇见了一个‘右括号’ ,那么移除栈中的一个元素
} else {
deque.pop();
}
}
//2、字符串中是右括号的情况:右括号多了
return deque.isEmpty();
}
1047. 删除字符串中的所有相邻重复项
解题动画演示:
思路:使用栈消除与字符串中相等的元素数据。
class Solution {
public String removeDuplicates(String s) {
//使用Deque作为堆栈
ArrayDeque<Character> deque = new ArrayDeque<>();
char ch;
for (int i = 0; i < s.length(); i++) {
ch = s.charAt(i); //获取字符串中的字母
if (deque.isEmpty() || deque.peek() != ch) {
deque.push(ch); //相邻元素不相等,添加元素进栈
} else {
deque.pop(); //相邻元素相等,移除栈顶元素
}
}
//栈中剩余的元素就是不重复非元素
String str = "";
while (!deque.isEmpty()) {
str = deque.pop() + str;
}
return str;
}
}