栈的应用
括号匹配问题
问题:
给出一个字符串,里面有三类括号:“(,)”、 “[,]”、 ”{,}”
括号成队出现并且嵌套正确,返回true ;否则返回false;
示例:
input:“({()})”
output: true
input:”{(]}”
output: false
算法:
依次扫描字符串。
1、如果出现左括号【 ‘(’、‘[’ 、‘{’ 】时。进栈。
2、如果出现右括号【 ‘)’、‘]’ 、‘}’ 】时
2.1、若栈空,表达式不匹配
2.2、若栈非空,取出栈顶元素,如果匹配则栈顶元素出栈,如果不匹配,表达式不匹配,直接退出 扫描。
3、最后还需要判断栈是否空,若空,则匹配成功
示例:表达式 “ ([]{}) ” 是否匹配成功。
1、第一次扫描:’( ‘ 左括号进栈

2、第二次扫描: ‘ [ ‘左括号进栈

3、第三次扫描:’ ] ‘ 右括号,当前栈非空,取出栈顶元素, ‘ [ ‘ ,匹配成功 ,栈顶元素出栈。

4、第四次扫描:’ { ‘ 左括号进栈

5、第五次扫描:’ } ‘ 右括号,当前栈非空,取出栈顶元素, ‘ { ‘ ,匹配成功 ,栈顶元素出栈。

6、第六次扫描:’ ) ‘ 右括号,当前栈非空,取出栈顶元素, ‘ ) ‘ ,匹配成功 ,栈顶元素出栈。

7、栈为空,匹配成功。
代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
|
public static Boolean parenthseis(String par){ char[] chars = par.toCharArray();
Boolean flag = true; Stack<Character> stack = new Stack<>();
for (int i = 0; i < chars.length; i++) { if(stack.isEmpty() && (chars[i] == '}' || chars[i] == ']' || chars[i] == ')')){ flag = false; break; } if((chars[i] == '{' || chars[i] == '[' || chars[i] == '(')){ stack.push(chars[i]); } if(!stack.isEmpty() && (chars[i] == '}' || chars[i] == ']' || chars[i] == ')')){ char pop = stack.pop();
if(pop == '(' && chars[i] != ')' ){ flag = false; break; }
if(pop == '[' && chars[i] != ']'){ flag = false; break; }
if(pop == '{' && chars[i] != '}'){ flag = false; break; } } }
if(stack.size() != 0){ flag = false; }
return flag; }
|
测试:
1 2 3 4 5 6
| public static void main(String[] args) { System.out.println(parenthseis("({})")); System.out.println(parenthseis("({[})")); System.out.println(parenthseis("")); System.out.println(parenthseis(")({})")); }
|
进制转换
问题:将十进制转换成二进制和十六进制
示例:
二进制:
input :8
output : 1000
十六进制:
input : 16
output : 10
算法:
十进制转换成二进制:除以2取余,倒序排列。使用栈就是为了倒序排列
十进制转换成十六进制:除以16取余,当余数为10-15时,就用 a-f来表示,最后倒序排列
示例:将42转换成二进制

出栈:二进制为:101010
示例:将30转换成十六进制

出栈:十六进制为 1e
代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
|
public static String Binary(int num){
if(num<0){ throw new RuntimeException("数字必须为正整数"); }
Stack<Integer> arrayStack = new Stack<Integer>();
while( num != 0){ arrayStack.push(num % 2); num = num / 2; }
StringBuilder stringBuilder = new StringBuilder();
while(arrayStack.size() != 0){ stringBuilder.append(arrayStack.pop()); }
return stringBuilder.toString();
}
public static String Hexadecimal(int num){ if(num<0){ throw new RuntimeException("数字必须为正整数"); }
Stack<String> stack = new Stack<>();
while(num != 0){
switch (num % 16){ case 10: stack.push("a"); break; case 11: stack.push("b"); break; case 12: stack.push("c"); break; case 13: stack.push("d"); break; case 14: stack.push("e"); break; case 15: stack.push("f"); break; default:stack.push(Integer.toString(num % 16)); break; }
num /= 16; }
StringBuilder stringBuilder = new StringBuilder(); while(stack.size() != 0){ stringBuilder.append(stack.pop()); }
return stringBuilder.toString(); }
|
测试:
1 2 3 4 5
| public static void main(String[] args) { System.out.println(Binary(42)); System.out.println(Hexadecimal(30)); System.out.println(Binary(-1)); }
|
简单的四则运算

示例:






代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
|
public static void calc(String expression1){ char[] expression = expression1.toCharArray(); Stack<Integer> numstack = new Stack<>(); Stack<Character> operstack = new Stack<>();
int index = 0; char ch=' '; int num1 = 0; int num2 = 0; char oper; int res = 0;
StringBuilder nums = new StringBuilder();
while(true){ ch = expression[index]; if(isOper(ch)){ if(!operstack.isEmpty()){ if(priority(ch) <= priority(operstack.peek())){ num1 = numstack.pop(); num2 = numstack.pop();
oper = operstack.pop(); res = cal(num1,num2,oper); numstack.push(res); operstack.push(ch); }else{ operstack.push(ch); } }else{ operstack.push(ch); } } else{ nums.append(ch); if(index == expression.length - 1){ numstack.push(Integer.parseInt(nums.toString())); }else { if(isOper(expression[index+1])){ numstack.push(Integer.parseInt(nums.toString())); nums.delete(0,nums.length()); } }
}
index++; if(index >= expression.length){ break; } }
while (true){ if(operstack.isEmpty()){ break; } num1 = numstack.pop(); num2 = numstack.pop(); oper = operstack.pop(); res = cal(num1,num2,oper); numstack.push(res); }
System.out.println(numstack.pop()); }
public static boolean isOper(char val){ return val == '+' || val == '-' || val == '*' || val == '/'; }
public static int cal(int num1,int num2,int oper){ int res = 0; switch (oper){ case '+': res = num2 + num1; break; case '-': res = num2 - num1; break; case '*': res = num2 * num1; break; case '/': res = num2 / num1; break;
default: break; }
return res; }
public static int priority(char oper){ if(oper == '*' || oper == '/'){ return 1; } else if(oper == '+' || oper == '-'){ return 0; } else { return 0; } }
|
测试:
1 2 3 4
| public static void main(String[] args) { calc("4*5+18/3"); calc("4+6*9-20"); }
|