去年写的一个表达式计算器程序,支持+、-、*、%运算,代码很乱不好理解,不过可以正确运行,贴出来希望可以供大家参考。其中的LinkStack是一个栈,也是自己写的,一块贴出来。
Calculator.java
- import java.util.*;
- public class Calculator{
- public static String transform(String input){
- StringBuffer sb=new StringBuffer();
- LinkStack<Character> stack=new LinkStack<Character>();
- int charcount=input.length();
- char topOperator;
- String date="";
- for(int i=0;i<charcount;i++){
- char test=input.charAt(i);
- if(test>='0'&&test<='9'){
- date=date+test;
- continue;
- }
- else{
- if (date!="") {
- sb.append(date+",");
- }
- date="";
- if(stack.Empty()){stack.push(test);continue;}
- switch(test){
- case '+':
- case '-':
- case '*':
- case '/':{
- while(!stack.Empty()){
- topOperator=stack.peek();
- if(precedence(test)<=precedence(topOperator)){
- sb.append(stack.pop()+",");
- } else {
- break;
- }
- }
- stack.push(test);
- break;
- }
- case '(':{stack.push(test);break;}
- case ')':{
- while((topOperator=stack.pop())!='(')
- {
- sb.append(topOperator+",");
- }
- break;
- }
- default:break;
- }
- }
- }
- sb.append(date+",");
- while(!stack.Empty()){
- sb.append(stack.pop()+",");
- }
- return sb.toString();
- }
- public static int count(String input){
- LinkStack<Integer> stack=new LinkStack<Integer>();
- String[] str=input.split(",");
- int result=0;
- for(int i=0;i<str.length;i++){
- if(!str[i].equals("")){
- if(!str[i].equals("+")&&!str[i].equals("-")&&!str[i].equals("*")&&!str[i].equals("/")){
- stack.push(Integer.parseInt(str[i]));
- }
- else{
- if(!stack.Empty()){
- int num1=stack.pop();
- int num2=stack.pop();
- switch(str[i].charAt(0)){
- case '+':{result=num2+num1;break;}
- case '-':{result=num2-num1;break;}
- case '*':{result=num2*num1;break;}
- case '/':{result=num2/num1;break;}
- }
- stack.push(result);
- }
- }
- }
- else
- continue;
- }
- return result;
- }
- public static int precedence(char ch){
- int pre=0;
- switch(ch){
- case '(': return pre=0;
- case '+':
- case '-': return pre=1;
- case '*':
- case '/': return pre=2;
- }
- return pre;
- }
- public static void main(String[] str){
- Scanner input=new Scanner(System.in);
- String st=input.nextLine().toString();
- String[] s=transform(st).split(",");
- System.out.print("后缀式:");
- for(int i=0;i<s.length;i++){
- if(!s[i].equals(""))
- System.out.print(s[i]);
- }
- System.out.println("\n"+"结果:"+count(transform(st)));
- }
- }
LinkStack.java
- public class LinkStack<T>{
- private class Node{
- private T date;
- private Node next;
- public Node(){}
- public Node(T date,Node next){
- this.date=date;
- this.next=next;
- }
- }
- private Node top;
- private int size;
- public LinkStack(){
- top=null;
- }
- public LinkStack(T element){
- top=new Node(element,null);
- size++;
- }
- public int length(){
- return size;
- }
- public void push(T element){
- top=new Node(element,top);
- size++;
- }
- public boolean Empty(){
- return size==0;
- }
- public T peek(){
- return top.date;
- }
- public T pop(){
- Node oldTop=top;
- top=top.next;
- oldTop.next=null;
- size--;
- return oldTop.date;
- }
- public void clear(){
- top=null;
- size=0;
- }
- public String toString(){
- if(Empty()){
- return "[]";
- }
- else{
- StringBuffer sb=new StringBuffer("[");
- for(Node current=top;current!=null;current=current.next){
- sb.append(current.date.toString());
- if(current.next!=null){
- sb.append(",");
- }
- }
- return sb.append("]").toString();
- }
- }
- }