▶ 뭉충닷컴
 
mungchung.com login
Site Search
My Space
주절주절...
공부방
쥔장소개
Board
자유게시판
유용한 정보
자료실
Programming
강좌 & Articles
Spring 3.0
프로그래밍 Tip
   -ASP
   -PHP
   -JavaScript
   -HTML
   -Java/JSP
   -Database
   -Crystal Report
   -Visual Basic
   -이클립스
   -리눅스
   -기타
Windows API (VB)
Spread Sheet 7.0
컴퓨터활용 Tip
Other things
StarCraft 전략
StarCraft 문서
김용(金庸)
Son Q & Dieda

java, infix를 postfix로 만들기

JAVA 조회 수 15506 추천 수 0 2007.04.05 14:44:17
기존 postfix가 연산을 못해서 다시 올린다...기존 소스는 아래있음
참고로 네이버 어디선가 퍼옴


import java.io.*;
import java.util.*;

class ListNode
{
  public Object data;
  public ListNode link;
}

class ListStack
{
  private ListNode top;
  
  public boolean isEmpty() {
    return (top == null);
  }
  
  public void push(Object x) {
    ListNode newNode = new ListNode();
    newNode.data = x;
    newNode.link = top;
    top = newNode;
  }
  
  public Object pop() {
    if (isEmpty()) return null;
    
    Object Item = top.data;
    top = top.link;
    
    return Item;
  }
  
  public void remove() {
    if (isEmpty()) return;
    
    top = top.link;
  }
  
  
  public Object peek() {
    if (isEmpty()) return null;
    
    return top.data;
  }
}

class Postfix
{
  private StringBuffer postfix;
  private String rawString;
  private ListStack listStack;
  
  public Postfix(String s) throws Exception {
    rawString = s;
    postfix = new StringBuffer();
    listStack = new ListStack();
    
    if (!makePostfix())
      throw new Exception("error : " + rawString);
  }
  
  public String getPostfix() {
    return postfix.toString().substring(0, postfix.toString().length() - 1);
  }
  
  public String getRawString() {
    return rawString;
  }
  
  public static boolean isOperator(char ch) {
    return ( ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '%' || ch == '^' );
  }
  
  private boolean makePostfix() {
    char ch, left;
    
    if (rawString.length() == 0) return false;
    
    for (int i = 0; i < rawString.length(); i++) {
      ch = rawString.charAt(i);
      
      if (ch == '(' || ch == '{' || ch == '[') {
        listStack.push(String.valueOf(ch));
      } else if (ch == ')') {
        try {
          while (!((String)listStack.peek()).equals("(")) {
            if (listStack.isEmpty()) return false;
            
            postfix.append((String)listStack.pop());
            postfix.append(" ");
          }
        } catch (NullPointerException e) {
          return false;
        }
        
        listStack.pop();
      } else if (ch == '}') {
        try {
          while (!((String)listStack.peek()).equals("{")) {
            if (listStack.isEmpty()) return false;
            
            postfix.append((String)listStack.pop());
            postfix.append(" ");
          }
        } catch (NullPointerException e) {
          return false;
        }
        
        listStack.pop();
      } else if (ch == ']') {
        try {
          while (!((String)listStack.peek()).equals("[")) {
            if (listStack.isEmpty()) return false;
            
            postfix.append((String)listStack.pop());
            postfix.append(" ");
          }
        } catch (NullPointerException e) {
          return false;
        }
        
        listStack.pop();
      } else if (ch >= '0' && ch <= '9') {
        do {
          postfix.append(String.valueOf(ch));
          
          try {
            ch = rawString.charAt(++i);
          } catch (StringIndexOutOfBoundsException e) {
            ch = ' ';
          }
        } while (ch >= '0' && ch <= '9');
        
        postfix.append(" ");
        i--;
      } else if (isOperator(ch)) {
        while (!listStack.isEmpty() && getPriority((String)listStack.peek()) >= getPriority(String.valueOf(ch))) {
          postfix.append((String)listStack.pop());
          postfix.append(" ");
        }
        
        listStack.push(String.valueOf(ch));
      } else if (ch == '.') {
        postfix.deleteCharAt(postfix.toString().length() - 1);
        postfix.append(String.valueOf('.'));
      } else if (ch == ' ' || ch == '\t') {
      } else {
        return false;
      }
    }
    
    while (!listStack.isEmpty())
      if (isOperator(((String) listStack.peek()).charAt(0))) {
        postfix.append(listStack.pop());
        postfix.append(" ");
      } else {
        return false;
      }
      
    return true;
  }
  
  private int getPriority(String operator) {
    if (operator.equals("(") || operator.equals("{") || operator.equals("["))
      return -1;
    else if (operator.equals("+") || operator.equals("-"))
      return 1;
    else
      return 2;
  }
}


public class Calculator
{
  private String postfix;
  private ListStack listStack;
  private double value;
  
  public Calculator(String s){
    postfix = s;
    listStack = new ListStack();
    value = 0;
  }
  
  public double getPostfixValue(){
    StringTokenizer token = new StringTokenizer(postfix, " ");
    
    while(token.hasMoreElements()) {
      String operator = token.nextToken();
      
      if (Postfix.isOperator(operator.charAt(0))) {
        double op1 = ((Double) listStack.pop()).doubleValue();
        double op2 = ((Double) listStack.pop()).doubleValue();
        
        value = calculate(operator, op1, op2);
        
        listStack.push(new Double(value));
      } else {
        listStack.push(Double.valueOf(operator));
      }
    }
    
    return ((Double) listStack.pop()).doubleValue();
  }
  
  private double calculate(String operator, double op1, double op2){
    switch(operator.charAt(0)){
      case '+' : return (op2 + op1);
      case '-' : return (op2 - op1);
      case '*' : return (op2 * op1);
      case '/' : return (op2 / op1);
      case '%' : return (op2 % op1);
      case '^' : return Math.pow(op2, op1);
      default :
        System.out.println("illegal operation");
        System.exit(1);
    }
    return 0;
  }
  
  public static void main(String[] args) {
    Postfix postfix = null;
    Calculator calc = null;
    
    try {

      //String rawString = "2**3**2";
      String rawString = "12+23-3*(16+48)+48";
      postfix = new Postfix(rawString);
    } catch (Exception e) {
      System.out.println(e.getMessage());
      System.exit(1);
    }
    
    System.out.println("infix : " + postfix.getRawString());
    System.out.println("postfix : " + postfix.getPostfix());
    
    calc = new Calculator(postfix.getPostfix());
    System.out.println("값 : " + calc.getPostfixValue());
  }
}



=========================================================================
==== 계산못하는 postfix 변환-_-
=========================================================================



http://www.java2s.com/Code/Java/Collections-Data-Structure/Convertsinfixarithmeticexpressionstopostfix.htm




import java.io.IOException;

public class InToPost {
  private Stack theStack;

  private String input;

  private String output = "";

  public InToPost(String in) {
    input = in;
    int stackSize = input.length();
    theStack = new Stack(stackSize);
  }

  public String doTrans() {
    for (int j = 0; j < input.length(); j++) {
      char ch = input.charAt(j);
      switch (ch) {
      case '+':
      case '-':
        gotOper(ch, 1);
        break; //   (precedence 1)
      case '*': // it's * or /
      case '/':
        gotOper(ch, 2); // go pop operators
        break; //   (precedence 2)
      case '(': // it's a left paren
        theStack.push(ch); // push it
        break;
      case ')': // it's a right paren
        gotParen(ch); // go pop operators
        break;
      default: // must be an operand
        output = output + ch; // write it to output
        break;
      }
    }
    while (!theStack.isEmpty()) {
      output = output + theStack.pop();

    }
    System.out.println(output);
    return output; // return postfix
  }

  public void gotOper(char opThis, int prec1) {
    while (!theStack.isEmpty()) {
      char opTop = theStack.pop();
      if (opTop == '(') {
        theStack.push(opTop);
        break;
      }// it's an operator
      else {// precedence of new op
        int prec2;
        if (opTop == '+' || opTop == '-')
          prec2 = 1;
        else
          prec2 = 2;
        if (prec2 < prec1) // if prec of new op less
        { //    than prec of old
          theStack.push(opTop); // save newly-popped op
          break;
        } else
          // prec of new not less
          output = output + opTop; // than prec of old
      }
    }
    theStack.push(opThis);
  }

  public void gotParen(char ch){
    while (!theStack.isEmpty()) {
      char chx = theStack.pop();
      if (chx == '(')
        break;
      else
        output = output + chx;
    }
  }

  public static void main(String[] args) throws IOException {
    String input = "1+2*4/5-7+3/6";
    String output;
    InToPost theTrans = new InToPost(input);
    output = theTrans.doTrans();
    System.out.println("Postfix is " + output + '\n');

  }
  class Stack {
    private int maxSize;
  
    private char[] stackArray;
  
    private int top;
  
    public Stack(int max) {
      maxSize = max;
      stackArray = new char[maxSize];
      top = -1;
    }
  
    public void push(char j) {
      stackArray[++top] = j;
    }
  
    public char pop() {
      return stackArray[top--];
    }
  
    public char peek() {
      return stackArray[top];
    }
  
    public boolean isEmpty() {
      return (top == -1);
    }
  }

}

문서 첨부 제한 : 0Byte/ 2.00MB
파일 크기 제한 : 2.00MB (허용 확장자 : *.*)
List of Articles
번호 제목 글쓴이 날짜 조회 수sort
551 ASP ASP 해킹 방지 보안 방법(injection, cross site scripting...) [3] 뭉충닷컴 2007-06-13 38654
550 JAVA getRequestURL jsp / servlet / java 현재 경로 알아내기 뭉충닷컴 2009-11-09 30777
549 JAVA HashMap, TreeMap, Hashtable 사용법 정리 file 뭉충닷컴 2008-01-29 29752
548 ASP 자동가입방지 그림문자 생성기 (CAPTCHA) [1] 뭉충닷컴 2007-05-16 24522
547 리눅스 리눅스 shell script로 날짜별로 로그파일 지우기 뭉충닷컴 2009-04-29 21836
546 DataBase 오라클에서 특정문자개수 구하기 [1] 뭉충닷컴 2009-12-30 21595
545 DataBase 오라클의 sequence 시작값 초기화 또는 변경 하기 뭉충닷컴 2009-02-23 21006
544 ASP [Win2003]CDO.Message.1 오류 80070005 액세스가 거부되었습니다. file 뭉충닷컴 2008-07-14 20264
543 이클립스 Java compiler level does not match the version of the installed Java project facet file 뭉충닷컴 2009-09-22 19841
542 DataBase dblink를 통한 insert시 속도향상 뭉충닷컴 2010-04-08 19610
541 DataBase 오라클 UPDATE JOIN 뭉충닷컴 2009-05-07 19547
540 JAVA 자바 소수점 자릿수 값 가져오기 뭉충닷컴 2010-01-14 19206
539 ASP ASP 정규식을 이용하여 문자열 패턴 적용하기 뭉충닷컴 2007-06-13 19114
538 VB 엑셀(Excel)과 엑서스(Access) mdb 파일 서로 연동하기 뭉충닷컴 2005-10-06 18987
537 DataBase 오라클 문자열 관련 함수 뭉충닷컴 2008-01-23 18628
536 기타 Toad 결과를 엑셀(.xls)로 내보낼 때 한글 깨짐문제 해결하기 뭉충닷컴 2008-03-31 18510
535 VB vbMHWB 컨트롤을 이용해 VB로 HTML , Script 제어하기 file 뭉충닷컴 2006-12-01 17959
534 기타 에디트 플러스(editplus)용 zen coding file [2] 뭉충닷컴 2010-02-05 17850
533 ASP URL에서 특수문자 오류나는 것 처리하기(escape, unescape) [2] 뭉충닷컴 2007-05-02 17707
532 Script 문자를 아스키코드로 변환, 아스키코드를 문자로 변환 뭉충닷컴 2010-12-22 17672
531 이클립스 dialog 창 크기조절 가능하도록(resize) 뭉충닷컴 2009-05-09 17584
530 DataBase comma 구분자 데이터를 row 형태로 가져오기 (SUBSTRING_INDEX 이용) 뭉충닷컴 2015-07-06 17530
529 이클립스 이클립스에서 톰캣 메모리 설정 뭉충닷컴 2010-06-29 17444
528 ASP 다중검색 쿼리 만들기 [2] 헤븡 2008-07-27 17266
527 JAVA 자바에서 외부 프로그램 실행방법 [1] 뭉충닷컴 2009-05-08 17248
526 ASP ASP로 엑셀(Excel) 파일 다루기 뭉충닷컴 2003-11-03 17067
525 이클립스 Syntax error, parameterized types are only available if source level is 5.0 file 뭉충닷컴 2009-09-22 17000
524 리눅스 find 명령어 여러가지 사용법 (리눅스 파일 찾기) 뭉충닷컴 2011-01-21 16924
523 리눅스 톰캣 프로세스 pid 파일로 저장 및 강제종료 뭉충닷컴 2009-08-26 16784
522 DataBase 오라클 문자열 byte 길이 가져오기 뭉충닷컴 2008-09-24 16650
521 이클립스 Text swt에 키보드 이벤트 ctrl + a 적용하기 뭉충닷컴 2009-05-24 16507
520 Script 자바스크립트로 layer(span, div, iframe) 사이즈 조절 막대 file 뭉충닷컴 2009-12-21 16240
519 JAVA java의 xml document 의 노드 내용 읽기 뭉충닷컴 2009-11-03 16192
518 VB MSFlexGrid의 내용을 Excel로 보내기 file 뭉충닷컴 2004-03-13 16186
517 Script jQuery drag and drop 플러그인 file 뭉충닷컴 2009-03-14 16134
516 DataBase MSSQL에서 날짜의 요일 정보 가져오기 뭉충닷컴 2007-02-01 16130
515 ASP 암호화를 이용해 사이트간 SSO 간단하게 처리하기 file 뭉충닷컴 2006-09-02 16087
514 DataBase 오라클에서 숫자만 추출하기 뭉충닷컴 2008-09-29 16085
513 HTML 프레임(frame)위에 레이어(layer) 띄우기 file 뭉충닷컴 2009-11-27 16059
512 ASP asp 에서 html 태그 제거하고 텍스트만 가져오는 함수 [2] 뭉충닷컴 2003-11-03 16052
511 ASP 소수점 몇째 자리 까지 표현하기 뭉충닷컴 2007-03-07 16048
510 JAVA url 접속해서 html 내용 가져오기 뭉충닷컴 2009-05-06 16040
509 VB SAP와 VB 연동하는 간단한 예제파일 file [1] 뭉충닷컴 2006-12-06 15853
508 JAVA 개발자가 놓치기 쉬운 자바의 개념, 기본원리 뭉충닷컴 2012-03-01 15812
507 Script vbscript 실행 시간 지연 뭉충닷컴 2010-06-09 15720
506 리눅스 (13) Permission denied Error 뭉충닷컴 2009-11-30 15653
505 Script ie에서 경고창 없이 창 닫기 뭉충닷컴 2010-02-19 15582
» JAVA java, infix를 postfix로 만들기 file 뭉충닷컴 2007-04-05 15506
503 VB VB에서 HTML의 스크립트 함수 호출및 Active X 호출 [1] 뭉충닷컴 2007-05-21 15493
502 Script 팝업창에서 부모창으로 폼값 submit 하기 뭉충닷컴 2007-03-19 15487
501 DataBase 세로행을 가로열에 콤마(,) 붙여서 출력하는 방법 2 -row to col [1] 뭉충닷컴 2008-07-31 15456
500 DataBase 10g 공백제거 정규표현식입니다. 뭉충닷컴 2009-05-15 15440
499 ASP 이전 URL 검사하는 팁(ASP) [1] 뭉충닷컴 2003-11-03 15336
498 기타 톰캣의 org.apache.jk.common.ChannelSocket processConnection 오류 해결하기 뭉충닷컴 2009-11-04 15275
497 ASP ASP 응용 프로그램의 문자열 처리 성능 향상 - 필독! [5] 뭉충닷컴 2007-06-14 15096
496 VB 폼의 제목표시줄 최소화, 최대화버튼 다루기 뭉충닷컴 2009-06-16 15069
495 Script showModalDialog (dialogArguments) 뭉충닷컴 2006-04-14 15038
494 DataBase 저장프로시저(sp)에서 테이블을 리턴할때 그걸 select 하는 방법 뭉충닷컴 2007-03-05 15005
493 HTML 레이어 팝업 띄워서 마우스로 이동 file 뭉충닷컴 2009-11-26 14936
492 PHP 간단한 다중 파일 업로드 [1] 뭉충닷컴 2004-07-06 14889