(一).基础概念
栈,在前面介绍数据结构的时候,都介绍过。这里就不多说了,直接看题目。
(二).具体题目
1.删除字符串中的所有相邻重复项
1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)

解法:使用"栈"模拟

java
class Solution {
public String removeDuplicates(String s){
StringBuilder stringBuilder=new StringBuilder();
char[] charArray = s.toCharArray();
for(char ch:charArray){
if (!stringBuilder.isEmpty() && stringBuilder.charAt(stringBuilder.length()-1)==ch){
//出栈
stringBuilder.deleteCharAt(stringBuilder.length()-1);
}else{
//入栈
stringBuilder.append(ch);
}
}
return stringBuilder.toString();
}
}
2.比较含退格的字符串

解法:使用"栈"模拟

java
class Solution {
public boolean backspaceCompare(String s, String t){
return changeString(s).equals(changeString(t));
}
private String changeString(String str) {
StringBuilder stringBuilder=new StringBuilder();
char[] charArray = str.toCharArray();
for (int i = 0; i < charArray.length; i++) {
if (charArray[i]!='#'){
stringBuilder.append(charArray[i]);
}else{
if (stringBuilder.length()>0){
stringBuilder.deleteCharAt(stringBuilder.length()-1);
}
}
}
return stringBuilder.toString();
}
}
3.基本计算器Ⅱ

解法:使用"栈"模拟

java
public int calculate(String s) {
char[] charArray = s.toCharArray();
Stack<Integer> stack=new Stack<>();
char ch='+'; //表示符号
for (int i = 0; i < charArray.length; ) {
if (charArray[i]==' '){
i++;
}else if (charArray[i]>='0' && charArray[i]<='9'){
int temp=0;
while (i<charArray.length && charArray[i]>='0' && charArray[i]<='9'){
temp=temp*10+(charArray[i]-'0');
i++;
}
if (ch=='+'){
stack.push(temp);
}else if (ch=='-'){
stack.push(-temp);
}else if (ch=='*'){
stack.push(stack.pop()*temp);
}else {
stack.push(stack.pop()/temp);
}
}else {
ch=charArray[i];
i++;
}
}
int ret=0;
while (!stack.isEmpty()){
ret+=stack.pop();
}
return ret;
}
4.字符串解码

解法:使用"栈"模拟


java
class Solution {
public String decodeString(String s){
Stack<StringBuilder> stackS=new Stack<>();
stackS.push(new StringBuilder());
Stack<Integer> stackI=new Stack<>();
char[] charArray = s.toCharArray();
for (int i = 0; i < charArray.length;) {
if (charArray[i]>='0' && charArray[i]<='9'){ //遇到数字的情况
int temp=0;
while (i<charArray.length && charArray[i]>='0' && charArray[i]<='9'){
temp=temp*10+(charArray[i]-'0');
i++;
}
stackI.push(temp);
}
if (charArray[i]=='['){ //遇到左括号的情况
i++;
StringBuilder stringBuilder=new StringBuilder();
while (i<charArray.length && charArray[i]>='a' && charArray[i]<='z'){
stringBuilder.append(charArray[i]);
i++;
}
stackS.push(stringBuilder);
}
if (charArray[i]==']'){ //遇到右括号的情况
Integer popI = stackI.pop();
StringBuilder popS = stackS.pop();
for (int j = 0; j < popI; j++) {
stackS.peek().append(popS);
}
i++;
}
StringBuilder stringBuilder=new StringBuilder();
while (i<charArray.length && charArray[i]>='a' && charArray[i]<='z'){ //处理没有数字的字符
stringBuilder.append(charArray[i]);
i++;
}
stackS.peek().append(stringBuilder);
}
return stackS.peek().toString();
}
}
5.验证栈序列

解法:使用"栈"模拟

java
class Solution {
public boolean validateStackSequences(int[] pushed, int[] popped){
Stack<Integer> stack=new Stack<>();
int posPop=0;
for(int x:pushed){
stack.push(x);
while (!stack.isEmpty() && stack.peek()==popped[posPop]){
stack.pop();
posPop++;
}
}
return stack.isEmpty();
}
}