java两数组进出栈顺序校验_关于JAVA数据结构_栈(栈的顺序和链式实现)

1 packagedemo3;2 importdemo2.MyArrayStack;3

4 /**

5 * 使用栈来计算算出表达式的值6 *@authorASUS7 *8 */

9 public classTestCalculateExpression {10

11 public static voidmain(String[] args) {12 String expression="4+3+(6-10+2*3)*4";13 double result=calculate(expression);14 System.out.println(result);15

16 }17 //定义方法计算指定次表达式的值

18 private static doublecalculate(String expression) {19 MyArrayStack operatorStack=newMyArrayStack();20 MyArrayStack operandStack=newMyArrayStack();21 //遍历表达式的操作数与操作符

22 for(int i=0;i

25 if(Character.isDigit(cc)){26 //取出操作数

27 StringBuilder sb=newStringBuilder();28 //只有是数字就是循环的一部分

29 while(Character.isDigit(cc)){30 sb.append(cc);31 i++;32 if(i>=expression.length()){33 break;34 }35 cc=expression.charAt(i);36 }37 //操作数入栈

38 operandStack.push(i);39 //修正i变量的值

40 i--;41 }else{42 //如果是操作符43 //栈为空,直接把操作符入栈

44 if(operatorStack.isEmpty()){45 operatorStack.push(cc);46 continue;47 }48 while(!operatorStack.isEmpty()){49 char op1=(char) operatorStack.peek();50

51 //操作符栈不为空的情况

52 if(compareOperator(op1,cc)<0){53 //当前运算符优先级高于栈顶运算符优先级

54 operatorStack.push(cc);55 break;56 }else if(compareOperator(op1,cc)==0){57 //当前运算符优先级等于栈顶运算符的优先级,只有一种情况,左边小括号遇到右边小括号

58 operatorStack.pop();59 break;60 }else{61 //栈顶运算优先级高62 //取出两个操作数

63 if(operandStack.isEmpty()){64 throw new RuntimeException( "表达式错误");65 }66 double num1=Double.parseDouble(operandStack.pop().toString());67 if(operandStack.isEmpty()){68 throw new RuntimeException( "表达式错误");69 }70 double num2=Double.parseDouble(operandStack.pop().toString());71 //取栈顶运算符

72 char operator=(char) operatorStack.pop();73 //计算num1和num2的值

74 double result=compute(operator,num2,num1);75 //把结果存储到操作栈中

76 operandStack.push(result);77 //如果栈为空,新的操作符入栈

78 if(operatorStack.isEmpty()){79 operatorStack.push(cc);80 break;81 }82 }83

84 }85 }86 }87 //当表达式遍历完后,如果操作字符串不为空,需继续计算

88 while(!operatorStack.isEmpty()){89 if(operandStack.isEmpty()){90 throw new RuntimeException( "表达式错误");91 }92 char operator=(char) operatorStack.pop();93 double num1=Double.parseDouble(operandStack.pop().toString());94 if(operandStack.isEmpty()){95 throw new RuntimeException( "表达式错误");96 }97 double num2=Double.parseDouble(operandStack.pop().toString());98 if(operandStack.isEmpty()){99 throw new RuntimeException( "表达式错误");100 }101 double result=compute(operator,num2,num1);102 operandStack.push(result);103 }104 //当操作栈为空,操作数多余一个数表达式错误

105 if(operandStack.getSize()>1){106 throw new RuntimeException( "表达式错误");107 }108 returnDouble.parseDouble(operandStack.pop().toString());109 }110 private static double compute(char operator, double num1, doublenum2) {111 switch(operator) {112 case '+':113

114 return num1+num2;115 case '-':116

117 return num1-num2;118 case '*':119

120 return num1*num2;121 case '/':122

123 return num1/num2;124

125 }126 return 0;127 }128 private static int compareOperator(char op1, charop2) {129 if(op1=='+'||op1=='-'){130 if(op2=='*'||op2=='/'||op2=='('){131 return -1;132 }133 }134 if(op1=='*'||op1=='/'){135 if(op2=='('){136 return -1;137 }138 }139 if(op1=='('){140 if(op2==')'){141 return 0;142 }else{143 return -1;144 }145 }146 return 1;147 }148

149 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
循环冗余校验(Cyclic Redundancy Check,CRC)是一种常用的数据校验方法,其本质是将要传输的数据通过一个特定的算法生成一个固定长度的校验码,接收方再利用相同的算法对接收到的数据校验,判断数据是否损坏。 下面是Java实现循环冗余八位校验的示例代码: ```java public class CRC8 { private static final int POLYNOMIAL = 0x1d; // CRC-8多项式 private static final int WIDTH = 8; // CRC-8校验位宽度 private static final int INIT_VALUE = 0x00; // CRC-8校验初始值 private static final int FINAL_XOR_VALUE = 0x00; // CRC-8校验最终值 public static int crc(byte[] data) { int crc = INIT_VALUE; for (int i = 0; i < data.length; i++) { crc ^= data[i] & 0xFF; for (int j = 0; j < WIDTH; j++) { if ((crc & 0x80) != 0) { crc = (crc << 1) ^ POLYNOMIAL; } else { crc = crc << 1; } } } return crc ^ FINAL_XOR_VALUE; } public static void main(String[] args) { byte[] data = new byte[]{0x01, 0x02, 0x03, 0x04}; int crc = crc(data); System.out.printf("%02X", crc); // 输出校验码 } } ``` 这段代码中,`POLYNOMIAL`、`WIDTH`、`INIT_VALUE`、`FINAL_XOR_VALUE`分别代表CRC-8多项式、CRC-8校验位宽度、CRC-8校验初始值和CRC-8校验最终值。`crc`方法接收一个字节数组作为输入数据,计算得到校验码并返回。在`main`方法中,我们构造了一个字节数组`data`,并计算得到其CRC-8校验码并输出。 需要注意的是,在Java中,byte类型是有符号的,范围是-128~127。因此,在计算CRC-8校验码时,需要将byte类型的数据行无符号扩展,即对其行一次&0xFF操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值