栈(Stack)是一种特殊的线性表,只能在一端进行操作,往栈中添加元素的操作,叫做push,入栈.
从栈中移除元素,叫做pop ,出栈,只能移除栈顶元素也叫做弹出栈顶元素.后进先出的原则.
栈的简单实现
这里运用java中的ArrayList简单实现了栈的结构
public class Stack<E> extends ArrayList<E> { public void push(E element){ add(element); } public E pop(){ return remove(size()-1); } public E top(){ return get(size()-1); } }
练习题:
-
https://leetcode-cn.com/problems/valid-parentheses/
-
https://leetcode-cn.com/problems/score-of-parentheses/comments/
题1:
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
int len = s.length();
for (int i = 0; i < len; i++) {
char c = s.charAt(i);
if (c=='('||c=='{'||c=='['){
stack.push(c);
}else {//右括号
if (stack.isEmpty()) return false;
char left = stack.pop();
if (left=='('&&c!=')') return false;
if (left=='['&&c!=']') return false;
if (left=='{'&&c!='}') return false;
}
}
return stack.isEmpty();
}
题2:
/**
* () 得 1 分。
AB 得 A + B 分,其中 A 和 B 是平衡括号字符串。
(A) 得 2 * A 分,其中 A 是平衡括号字符串。
* @param s
* @return
*/
public int isValid(String s) {
Stack<Integer> stack = new Stack<>();
int len = s.length();
for (int i = 0; i < len; i++) {
char c = s.charAt(i);
if (c=='('){
stack.push(-1);//用-1表示左括号;
}else{
if (c==')'){//遇到右括号
Integer peek = stack.peek();//获取栈顶元素
if (peek==-1){
//直接合并为1 左括号(-1)出栈
stack.pop();
stack.push(1);//入栈 表示合并完成的A
}else{//不为-1 表示有嵌套 (A) 得 2 * A 分 所以要乘2
int t=0;//声明一个临时变量用于存储内部的值
while (!stack.isEmpty()){
Integer peek1 = stack.peek();
stack.pop();
if (peek1==-1){//表示遇到了左括号 表示完结了 跳出循环
break;
}else{
t+=peek1; //表示遇到的不是左括号 就得把内部的合并好的()相加
}
}
stack.push(t*2);//因为第一次遇到的一定不会是-1 所以t一定不会是0
}
}
}
}
int sum = 0;
if (!stack.isEmpty()){
while (!stack.isEmpty()){
Integer peek = stack.peek();
sum+=peek;
stack.pop();
}
}
return sum;
}