第二问
Topic source啊啊啊啊 写错了 这个才是最正确的
package aaaaa;
import java.util.*;
public class zbianh {
public static void main(String[] args) {
String exp = "x + 2 * ( y - 5 )";
SuffixExpression se = compile(exp);
System.out.println(se.dayin());
Map<String, Integer> env = Map.of("x", 1, "y", 9);
int result = se.execute(env);
System.out.println(exp + " = " + result + " " + (result == 1 *+ 2 * (9 - 5) ? "✓" : "✗"));
}
static int getPriority(char temp) {
int prior = 0;
switch(temp) {
case '+' : prior =0;
break;
case '-' : prior = 0;
break;
case '*' : prior =1;
break;
case '/' : prior = 1;
break;
case '(' : prior = 2;
break;
case ')' : prior = 2;
break;
default:
}
return prior;
}
static SuffixExpression compile(String exp) {
// TODO:
//1.定义优先级
//2.设定栈
Deque<Character> stack = new LinkedList<>();
StringBuilder result = new StringBuilder();
int size = exp.length();
System.out.println(size);
for(int i =0;i<size;i++) {
System.out.println(result.toString());
char temp = (char)exp.charAt(i);
if(temp ==' ') {
continue;
}
if(Character.isLetter(temp)||Character.isDigit(temp)) {
result.append(temp);
}
else {
if(temp ==')') {//要是把)设置为
while(stack.peek()!='(') {
result.append(stack.pop());
}
stack.pop();
}
else {
int prior = getPriority(temp);
while(true) {
//如果栈空,那么这个符号先 放入
if(stack.peek()==null) {
stack.push(temp);
break;
}
else {
if(getPriority(stack.peek())>=prior && stack.peek()!='(') {
result.append(stack.pop());
}
else {
stack.push(temp);
break;
}
}
}
}
}
}
//处理完入栈的操作,把栈清空
while(stack.peek()!=null) {
result.append(stack.pop());
}
return new SuffixExpression(result);
}
}
class SuffixExpression {
private StringBuilder exp1;
SuffixExpression(StringBuilder exp){
this.exp1 = exp;
}
public String dayin() {
return exp1.toString();
}
int execute(Map<String, Integer> env) {
// TODO:
Deque<Integer> stacknumber = new LinkedList<>();
int result =0;
for(int n = 0;n<exp1.length();n++) {
if(Character.isLetter(exp1.charAt(n))){
Integer a = env.get(""+exp1.charAt(n));
System.out.println(a.intValue());
stacknumber.push(a);
}
else if(Character.isDigit(exp1.charAt(n))) {
stacknumber.push(new Integer((int)exp1.charAt(n)-48));
}
else {
int temp1 = stacknumber.pop().intValue();
System.out.println(temp1);
int temp2 = stacknumber.pop().intValue();
System.out.println(temp2);
char temp = exp1.charAt(n);
switch(temp) {
case '+' : result = temp1 + temp2;break;
case '-' : result = temp2 - temp1;break;
case '*' : result = temp1 * temp2;break;
case '/' : result = temp2 / temp1;break;
default:
}
stacknumber.push(result);
}
}
return stacknumber.pop().intValue();
}
}
- 1
dx
package aaaaa;
import java.util.*;
public class zbianh {
public static void main(String[] args) {
String exp = "x + 2 * ( y - 5 )";
SuffixExpression se = compile(exp);
System.out.println(se.dayin());
Map<String, Integer> env = Map.of("x", 1, "y", 9);
int result = se.execute(env);
System.out.println(exp + " = " + result + " " + (result == 1 + 2 * (9 - 5) ? "✓" : "✗"));
}
static int getPriority(char temp) {
int prior = 0;
switch(temp) {
case '+' : prior =0;
break;
case '-' : prior = 0;
break;
case '*' : prior =1;
break;
case '/' : prior = 1;
break;
case '(' : prior = 2;
break;
case ')' : prior = 2;
break;
default:
}
return prior;
}
static SuffixExpression compile(String exp) {
// TODO:
//1.定义优先级
//2.设定栈
Deque<Character> stack = new LinkedList<>();
StringBuilder result = new StringBuilder();
int size = exp.length();
System.out.println(size);
for(int i =0;i<size;i++) {
System.out.println(result.toString());
char temp = (char)exp.charAt(i);
if(temp ==' ') {
continue;
}
if(Character.isLetter(temp)||Character.isDigit(temp)) {
result.append(temp);
}
else {
if(temp ==')') {//要是把)设置为
while(stack.peek()!='(') {
result.append(stack.pop());
}
stack.pop();
}
else {
int prior = getPriority(temp);
while(true) {
//如果栈空,那么这个符号先 放入
if(stack.peek()==null) {
stack.push(temp);
break;
}
else {
if(getPriority(stack.peek())>=prior && stack.peek()!='(') {
result.append(stack.pop());
}
else {
stack.push(temp);
break;
}
}
}
}
}
}
//处理完入栈的操作,把栈清空
while(stack.peek()!=null) {
result.append(stack.pop());
}
return new SuffixExpression(result);
}
}
class SuffixExpression {
private StringBuilder exp1;
SuffixExpression(StringBuilder exp){
this.exp1 = exp;
}
public String dayin() {
return exp1.toString();
}
int execute(Map<String, Integer> env) {
// TODO:
Deque<Integer> stacknumber = new LinkedList<>();
Deque<Character> stackchar = new LinkedList<>();
System.out.println(exp1.length());
for(int n = 0;n<exp1.length();n++) {
if(Character.isLetter(exp1.charAt(n))){
Integer a = env.get(""+exp1.charAt(n));
System.out.println(a.intValue());
stacknumber.push(a);
}
else if(Character.isDigit(exp1.charAt(n))) {
stacknumber.push(new Integer((int)exp1.charAt(n)-48));
}
else {
stackchar.add(Character.valueOf(exp1.charAt(n)));
}
}
int resulttemp = 0;
while(stackchar.peek()!=null) {
int temp1 = stacknumber.pop().intValue();
System.out.println(temp1);
int temp2 = stacknumber.pop().intValue();
System.out.println(temp2);
char temp = stackchar.remove();
resulttemp=0;
switch(temp) {
case '+' : resulttemp = temp1 + temp2;break;
case '-' : resulttemp = temp2 - temp1;break;
case '*' : resulttemp = temp1 * temp2;break;
case '/' : resulttemp = temp2 / temp1;break;
default:
}
if(stacknumber.peek()!=null) {
stacknumber.push(resulttemp);
}
}
return resulttemp;
}
}