1 基础练习
答案:C
答案:B
2.打印栈
// 递归方式
void printList(Node head){
if(null != head){
printList(head.next);
System.out.print(head.val + " ");
}
}
// 循环方式
void printList(Node head){
if(null == head){
return;
}
Stack<Node> s = new Stack<>();
// 将链表中的结点保存在栈中
Node cur = head;
while(null != cur){
s.push(cur);
cur = cur.next;
}
3.表达式转换
中缀转后缀写代码有点难emmm后续算法我会补上(关注我,算法专栏会详细讲解)
中缀转后缀数字图
神奇的栈
用栈来表达后缀表达式
遇到符号弹出和右边操作数进行运算然后放入栈以此循环,最后剩下的数字就是运算结果
学过安卓的同学相信会很熟悉(后续会更新安卓感兴趣可以关注一下)
总结:只要是数字就放到栈里面,遇到运算符,就弹出栈顶元素,这两个元素进行运算。
4.逆波兰式(打了20minemmmm累)
代码实现(敲太嗨了搞成c++的了主题代码是对的搞到java中)
class Solution {
public:int evalRPN(vector<string>& tokens) {stack<Integer> stack = new stack<>() ;for(i = 1; i <= tokens.length;i++){//每次循环可以拿到字符串所以要判断运算符是否合法,定义一个私有方法isOperations方法string str = takens[i] ;//将String类型变成int类型if(isOperations(str)){//不是运算符就是数字就放入栈int val = Integer.valueof(str);stack.push(val)}else{//式运算符,如果是运算符就弹出两个元素int num2 = stack.pop();//先弹出一个然后计算int num2 = stack.pop();switch(str){case"+":stack.push(num1 + num2);break;case"-":stack.push(num1-num2);break;case"*":stack.push(num1*num2);break;stack.push(num1/num2);case"/":break;}}return stack.pop;//最后的元素就是计算结果}//只要式加减乘除就式trueprivate boolean isOperations (string){if(str.equals("+")||str.equals("-")||str.equals("*")||str.equals("/")){return true;}else{return false;}}}
};
5.括号匹配
不能以括号次数来判断
一般和顺序相关的排序就可以考虑使用栈。
栈的弹出可以更好的判断括号
定义一个下标i来标记,红色的框是三种不匹配的情况其他情况都是匹配的
代码实现
6.最小栈
思路
代码实现