java中栈继承了Vector,源码很简单,采用的是顺序存储结构。
实现栈:
import java.util.Arrays;
public class Stack {
private Object[] elementData;
private int size;
public Stack() {
this(10);
}
public Stack(int initialCapacity) {
this.elementData = new Object[initialCapacity];
}
public int size() {
return this.size;
}
public Object push(Object obj) {
// 检查表空间是否以满
check(size + 1);
elementData[size++] = obj;
return obj;
}
private void check(int minCapacity) {
if (minCapacity - elementData.length < 0) {
int oldCapactity = elementData.length;
int newCapacity = oldCapactity << 1;
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
public Object pop() {
final Object last;
last = elementData[size - 1];
elementData[size - 1] = null;
size--;
return last;
}
public static void main(String[] args) {
Stack s = new Stack();
}
}
逆波兰表达式:
package demo;
import java.util.Scanner;
import java.util.Stack;
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
char[] data = input.toCharArray();
StringBuilder sb = new StringBuilder();
Stack<Character> ops = new Stack<>();
Stack<Double> vals = new Stack<>();
toPostfix(data, sb, ops);
scanner.close();
// 9+(3-1)*3+8/2
calculate(sb, vals);
System.out.println(sb.toString());
System.out.println("----");
System.out.println(vals.pop());
}
/**
* @param sb
* @param vals
* 存后缀表达式的栈
*/
public static void calculate(StringBuilder sb, Stack<Double> vals) {
for (int i = 0; i < sb.length(); i++) {
Character c = sb.charAt(i);
System.out.println(c);
// 将数字压入栈
if (getPriority(c) == 0) {
vals.push(Double.valueOf(c.toString()));
} else { // 弹出栈顶的元素,计算压入栈
Double top = vals.pop();
Double second = vals.pop();
double result = 0;
if (c.equals('-'))
result = second - top;
if (c.equals('+'))
result = second + top;
if (c.equals('*'))
result = second * top;
if (c.equals('/'))
result = second / top;
vals.push(result);
}
}
}
/**
* @param data
* 输入的数据
* @param sb
* 保存后缀表达式
* @param ops
* 存运算符的栈
*/
public static void toPostfix(char[] data, StringBuilder sb, Stack<Character> ops) {
int priority = 0;// 标记栈顶元素的优先级
for (int i = 0; i < data.length; i++) {
Character c = data[i];
System.out.println(c);
// 遇到右括号弹出栈顶运算符
if (c.equals(')')) {
Character popData = ops.pop();
sb.append(popData);
}
// 如果是运算符
if (getPriority(c) != 0) {
// 比较栈顶运算符优先级,大于等于压入栈,否则弹出全部
if (getPriority(c) >= priority) {
ops.push(c);
priority = getPriority(c);
} else {
while (!ops.isEmpty()) {
Character popData = ops.pop();
sb.append(popData);
}
// 将当前运算符压入栈
ops.push(c);
}
} else if (!c.equals('(') && !c.equals(')')) {
sb.append(c + ' ');
}
}
// 将栈内所有剩余的运算符弹出
while (!ops.isEmpty()) {
sb.append(ops.pop());
}
}
/**
* @param c
* @return 返回运算符的优先级
*/
private static int getPriority(char c) {
switch (c) {
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
default:
return 0;
}
}
}
只能输入数字1-9,双位数判断没有想通请大神指教