栈(Stack):一种特殊的 线性表,其只允许在固定的一端(栈顶)进行插入和删除元素操作(另一端为栈底)。栈中的数据元素遵循先进后出(LIFO)的原则。
栈的一些基本方法:
1.public stack();创建栈
2. public E push(); 入栈
3. public E pop(); 出栈(删除栈顶元素)
4. public E peek()查看栈顶元素(不删除)
5. public boolean empty(); 判断栈是否为空
栈的实现(用数组):
代码如下(以int类型数据为例):
public class MyStack {
private int[] elem;
private int top;//既可以代表栈顶元素也可代表当前栈大小 --》usedSize;
public MyStack(){
this.elem = new int[10];
}
public boolean isFull(){
return this.top == this.elem.length;
}
public int push(int value){
if(isFull()){
throw new RuntimeException("栈已满!");
}
this.elem[this.top] = value;
this.top++;
return this.elem[this.top-1];
}
public int pop() {
if(empty()){
throw new RuntimeException();
}
this.top--;
return this.elem[top];
}
public int peek() {
if(empty()){
throw new RuntimeException();
}
return this.elem[top-1];
}
public boolean empty(){
return this.top == 0;
}
public int size(){
return this.top;
}
public static void main(String[] args) {
MyStack myStack = new MyStack();
myStack.push(2);
myStack.push(6);
myStack.push(9);
myStack.push(1);
System.out.println(myStack.peek());
System.out.println(myStack.pop());
System.out.println(myStack.peek());
System.out.println(myStack.size());
System.out.println(myStack.empty());
}
}
栈的应用:
例:括号匹配问题:
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
1.左括号必须用相同类型的右括号闭合。
2.左括号必须以正确的顺序闭合。
代码如下:
class Solution {
public boolean isValid(String s) {
if(s.length()%2 != 0)return false;
Stack<Character> stack = new Stack<>();
for(int i = 0; i < s.length(); i++){
char ch =s.charAt(i);
if(ch == '(' || ch == '[' || ch == '{'){
stack.push(ch);
}else{
if(stack.empty()){
return false;
}
char ret = stack.peek();
if(ret == '(' && ch == ')' || ret == '[' && ch == ']' || ret == '{' && ch == '}'){
stack.pop();
}else{
return false;
}
}
}
if(!stack.empty()){
return false;
}
return true;
}
}