wordpress建站的好处,襄阳seo推广,做网站公司不给源码,安亭做网站公司一、栈Stack
1.1 概念
一种特殊的线性表#xff0c;只允许在固定的一段进行插入和删除元素操作。进行数据的插入和删除操作的一段称为栈顶#xff0c;另一端称为栈低。栈中的元素遵循后进先出 LIFO(Last In First Out)的原则。 进栈 出栈 举例#xff1a;在word中#xf…一、栈Stack
1.1 概念
一种特殊的线性表只允许在固定的一段进行插入和删除元素操作。进行数据的插入和删除操作的一段称为栈顶另一端称为栈低。栈中的元素遵循后进先出 LIFO(Last In First Out)的原则。 进栈 出栈 举例在word中如果要想进行添加、删除。修改相关信息则当用户选择撤销时程序将会返回上一个操作状态。
1.2 栈的使用
栈的方法及其功能 方法 功能Stack()构造一个空栈E push(E e)将e入栈并返回eE pop()将栈顶元素出栈并返回E peek()获取栈顶元素int size()获取栈中有效元素个数boolean empty()检测栈是否为空
public static void main(String[] args) {StackInteger s new Stack();s.push(1);s.push(2);s.push(3);s.push(4);System.out.println(s.size()); // 获取栈中有效元素个数--- 4System.out.println(s.peek()); // 获取栈顶元素--- 4s.pop(); // 4出栈栈中剩余1 2 3栈顶元素为3System.out.println(s.pop()); // 3出栈栈中剩余1 2 栈顶元素为3if(s.empty()){System.out.println(栈空);}else{System.out.println(s.size());}
}
1.3 模拟实现栈 Stack继承了VectorVector和ArrayList类似都是动态的顺序表不同的是Vector是线程安全的.
public class MyStack {public int[] elem;public int usedSize;public MyStack() {this.elem new int[10];}public void push(int val) {if(isFull()) {this.elem Arrays.copyOf(elem,2*elem.length);}elem[usedSize] val;}private boolean isFull() {return usedSize elem.length;}public int pop() {if(isEmpty()) {throw new EmptyStackException(pop()空栈异常);}int val elem[usedSize - 1];usedSize--;return val;}public int peek() {if(isEmpty()) {throw new EmptyStackException(peek()空栈异常);}return elem[usedSize - 1];}private boolean isEmpty() {return usedSize 0;}
}
1.4 栈的应用场景
1. 改变元素的序列 若进栈序列为 1,2,3,4 进栈过程中可以出栈则下列不可能的一个出栈序列是
A: 1,4,3,2 B: 2,3,4,1 C: 3,1,4,2 D: 3,4,2,1
解析错误出栈序列的解析如下正确出栈序列解析同下 2.一个栈的初始状态为空。现将元素1、2、3、4、5、A、B、C、D、E依次入栈然后再依次出栈则元素出栈的顺序是 。
A: 12345ABCDE B: EDCBA54321 C: ABCDE12345 D: 54321EDCBA
解析根据栈中元素遵循先进后出的原则得出栈顺序为EDCBA54321
2. 将递归转化为循环链表
// 递归方式
void printList(Node head){if(null ! head){printList(head.next);System.out.print(head.val );}
}
// 循环方式
void printList(Node head){if(null head){return;}StackNode s new Stack();// 将链表中的结点保存在栈中Node cur head;while(null ! cur){s.push(cur);cur cur.next;}// 将栈中的元素出栈while(!s.empty()){System.out.print(s.pop().val );}
}
3. 括号匹配 首先判断获取的字符是否是左括号如果是则插入到栈中如果栈为空则返回false如果前两种情况都不是则此时为右括号然后判断栈顶元素和当前字符进行匹配若满足条件则删除栈顶元素否则返回false。最后当字符串遍历完后如果栈中还有元素则此时左括号多返回false。如果栈为空则返回true。
class Solution {public boolean isValid(String s) {//创建一个空栈StackCharacter stack new Stack();for(int i 0;i s.length();i) {//遍历字符串获取字符char ch s.charAt(i);//如果ch为左括号则放入栈中if(ch ( || ch [ || ch { ) {stack.push(ch);}else {//此时ch为右括号//情况1栈中没有左括号进行匹配右括号多if(stack.isEmpty()){return false;}//情况2栈中右左括号需判断栈顶ch2右括号是否和ch右括号匹配char ch2 stack.peek();if( ch2 ( ch ) || ch2 [ ch ] || ch2 { ch } ) {stack.pop();}else {//此时栈不为空但括号不匹配return false;}}}//字符串已经遍历完了若栈不为空则左括号多if(!stack.isEmpty()) {return false;}return true;}
}
4. 逆波兰表达式 class Solution {public int evalRPN(String[] tokens) {StackInteger stack new Stack();for(String str : tokens) {if(isNumber(str)) {int x Integer.parseInt(str);stack.push(x);}else {int val2 stack.pop();int val1 stack.pop();switch (str) {case :stack.push(val1 val2);break;case -:stack.push(val1 - val2);break;case *:stack.push(val1 * val2);break;case /:stack.push(val1 / val2);break;}}}return stack.pop();}private boolean isNumber(String str) {return !(str.equals()|| str.equals(- )|| str.equals(*)|| str.equals(/));}
}5. 出栈入栈次序匹配 解析遍历pushV数组每次入栈一个元素后将栈顶元素与popV中下标为j所对应的元素进行比较如果一样则可以出栈不一样i。在遍历时可能会出现多个相同所以需用到循环
public class Solution {/*** 代码中的类名、方法名、参数名已经指定请勿修改直接返回方法规定的值即可** * param pushV int整型一维数组 * param popV int整型一维数组 * return bool布尔型*/public boolean IsPopOrder (int[] pushV, int[] popV) {// write code hereStackInteger stack new Stack();int j 0;for(int i 0;i pushV.length;i) {stack.push(pushV[i]);while(!stack.empty() j popV.length stack.peek() popV[j]) {stack.pop();j;}}return stack.empty();}
}
6.最小栈 class MinStack {public StackInteger stack;public StackInteger minStack;public MinStack() {stack new Stack();minStack new Stack();}public void push(int val) {stack.push(val);if(minStack.isEmpty() || val minStack.peek()) {minStack.push(val);}else {return;}}public void pop() {if(minStack.isEmpty()) {return;}int popVal stack.pop();if(popVal minStack.peek()) {minStack.pop();}}public int top() {if(minStack.isEmpty()) {return -1;}return stack.peek();}public int getMin() {if(minStack.isEmpty()) {return -1;}return minStack.peek();}
}