2014년 4월 8일 화요일

[자바계산기,중위후위표기]JAVA STACK자바JAVA스택을 이용한 자바 윈도우계산기(JAVA AWT,Swing Stack Calculator),[자바개발자교육/자바교육/자바강좌/자바교육잘하는곳/자바교육추천/자바실무교육/JAVA/JAVA교육/JAVA학원/JAVA실무교육]

[자바계산기,중위후위표기]JAVA STACK자바JAVA스택을 이용한 자바 윈도우계산기(JAVA AWT,Swing Stack Calculator),[자바개발자교육/자바교육/자바강좌/자바교육잘하는곳/자바교육추천/자바실무교육/JAVA/JAVA교육/JAVA학원/JAVA실무교육]
 
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
class MyCal
{
 public Stack stack;
 public Stack CalStack;
 public ArrayList list;

 MyCal()
 {
  list = new ArrayList();   //token 구분 하기 위한 리스트
  stack = new Stack();   //괄호? 체크 하기 위한 스택
  CalStack = new Stack();  //후위로 변환 하여 저장
 }

 public boolean isOperator(char ch)
 {
  return ( (ch =='+') || (ch =='-') || (ch=='*') || (ch=='/') );
 }

 public int precedence(String op)
 {
  //연산자 우선순위 체크
  if(op.charAt(0) == '(') return 0;
  if((op.charAt(0) =='+') || (op.charAt(0) =='-')) return 1;
  if((op.charAt(0) =='*') || (op.charAt(0) =='/')) return 2;
  else return 3;
 }
 public int precedence(char op)
 {
  //연산자 우선순위 체크
  if(op == '(') return 0;
  if((op =='+') || (op =='-')) return 1;
  if((op =='*') || (op =='/')) return 2;
  else return 3;
 }

 public void postfix(String exp)
 {
  //변환 하기 전에 스택과 리스트를 비워 준다 .
  CalStack.clear();
  list.clear();
  //중위 표기법 후위 표기법으로 변환
  for(int i = 0; i<exp.length();i++)
  {
   char ch = exp.charAt(i);
  
   if(ch=='(')
   {
    // ( 라면 스택에 푸쉬
    String str = new String();
    str += ch;
    CalStack.push(str);
   }
   else if(ch == ')')
   {
    // ) 를 만나면 (가 나올때 까지 팝하고 (는 버림
    while(true)
    {
     String dst = (String)CalStack.pop();
     if(dst.charAt(0) != '(')
     {
      list.add(dst);
     }
     else break;
    }
   }
   else if(isOperator(ch))
   {//연산자 라면 우선순위를 체크해서 자신보다 높은 연산자 우선순위의 값은 팝
    while((!CalStack.empty()) && (precedence((String)CalStack.peek()) >= precedence(ch)))
    {
     list.add(CalStack.pop());
    }
    String str = new String();
    str += ch; //그리고 자기 자신을 푸쉬 하여 준다.
    CalStack.push(str);
   }
   else if(ch >= '0' && ch <= '9')
   {//피연산자라면 ....
    String str = new String();
    do
    {//숫자가 연속해서 있을 수도 있기 때문에....
     str += ch;
     i++;
     if(i < exp.length())
     {
      ch = exp.charAt(i);
     }
     else break;
    }while(ch >= '0' && ch <= '9');
   
    list.add(str);
    i--;
   }
  }
  while(!CalStack.empty())
  {
   String str = new String();
   str = (String)CalStack.pop();
   list.add(str);
  }
 }
 public String calc()
 {
  CalStack.clear();
  long l;
  while(!list.isEmpty())
  {
   String str = (String)list.get(0);
   list.remove(0);
   if((str.charAt(0) >= '0') && (str.charAt(0) <= '9'))
   {//피연산자라면 푸쉬
    CalStack.push(str);
   }
   else if(str.charAt(0) == '*')
   {//연산자 이면 팝을 두번 해서 그결과를 푸쉬
    String dst = (String)CalStack.pop();
    String src = (String)CalStack.pop();
    l = Long.parseLong(dst) * Long.parseLong(src);
    String buf = String.valueOf(l);
    CalStack.push(buf);
   }
   else if(str.charAt(0) == '+')
   {
    String dst = (String)CalStack.pop();
    String src = (String)CalStack.pop();
    l = Long.parseLong(dst) + Long.parseLong(src);
    String buf = String.valueOf(l);
    CalStack.push(buf);
   }
   else if(str.charAt(0) == '/')
   {// / 나 - 일 경우에는 자리가 변경 되면 안되므로 자리에 맞춰서 계산 하여 준다
    String dst = (String)CalStack.pop();
    String src = (String)CalStack.pop();
    l = Long.parseLong(src) / Long.parseLong(dst);
    String buf = String.valueOf(l);
    CalStack.push(buf);
   }
   else if(str.charAt(0) == '-')
   {
    String dst = (String)CalStack.pop();
    String src = (String)CalStack.pop();
    l = Long.parseLong(src) - Long.parseLong(dst);
    String buf = String.valueOf(l);
    CalStack.push(buf);
   }
  }
  return (String)CalStack.pop();
 }
 public boolean bracketsBalance(String exp)
 {//괄호의 수식이 맞는지 체크
  //스택을 비원줌
  stack.clear();
  for(int i = 0; i<exp.length();i++)
  {
   char ch= exp.charAt(i);
   //시작 괄호 이면 스택에 넣음
   if(ch=='[' || ch == '(')
   {
    stack.push(new Character(ch));
   }
   else if(ch == ']' || ch == ')')
   {
    //파싱중 우측 괄호를 봤는데 스택이 비어 있다면 오류
    if(stack.isEmpty()) return false;
    //우선 스택에서 하나를 꺼낸다.
    char charFromStack = ((Character)stack.pop()).charValue();
    //파싱한 것이 '('인데 스택에서 꺼낸것이 ')'아니거나,
    //파싱한 것이 '['인데 스택에서 꺼낸것이 ']'아닌경우
    if(ch==']' &&charFromStack !='['||(ch==')'&&charFromStack!='('))return false;
   
   }//end if
  }//end for loop
  return stack.isEmpty(); //empty means matched, else unmatched
 }
 public boolean Lexical()
 {//수식이 맞는지 안 맞는지 판단...
  //기존의 후위 연산 변경 리스트에서 가져와서 수식이 맞는지 체크 한다
  int f = 0;
  for(int i = 0; i < list.size();i++)
  {
   String exp = (String) list.get(i);
   char ch= exp.charAt(0);
   while(ch == ')' || ch == '(')
   {//괄호는 무시 
    i++;
    exp = (String) list.get(i);
    ch = exp.charAt(0);
   }
   if(isOperator(ch)) f--;
   else
   {
    f++;
     ch= exp.charAt(0);
   }
   if(f<1) break; //f가 1보다 작으면 언더 플로
  }
  return f==1;
 }
}

class Console{
 //클래스 이름에 대한 문자열로 타이틀을 생성 한다.
 public static String title(Object o){
  String t = o.getClass().toString();
  //class라는 단어를 제거 한다
  if(t.indexOf("class") != -1){
   t = t.substring(6);
  }
  return t;
 }

 //프레임의 경우 에 Run
 public static void run(JFrame frame, int width, int height){
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.setSize(width, height);
  frame.setVisible(true);
 }
 public static void run(JApplet applet, int width, int height){
  JFrame frame = new JFrame(title(applet));
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.getContentPane().add(applet);
  frame.setSize(width, height);
 
  //애플릿 초기화
  applet.init();
  applet.start();
  frame.setVisible(true);
 }
 public static void
 run(JPanel panel, int width, int height){
  JFrame frame = new JFrame(title(panel));
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.getContentPane().add(panel);
  frame.setSize(width, height);
  frame.setVisible(true);
 }
};
class Calculator extends JFrame {
 MyCal cal = new MyCal();
 //버튼 할당
 private JButton
 b1 = new JButton("1"),
 b2 = new JButton("2"),
 b3 = new JButton("3"),
 b4 = new JButton("4"),
 b5 = new JButton("5"),
 b6 = new JButton("6"),
 b7 = new JButton("7"),
 b8 = new JButton("8"),
 b9 = new JButton("9"),
 b0 = new JButton("0"),
 mul = new JButton("*"),
 min = new JButton("-"),
 dev = new JButton("/"),
 plus = new JButton("+"),
 equal = new JButton("="),
 Lbrackets = new JButton("("),
 Rbrackets = new JButton(")"),
 bc = new JButton("c");
 private JTextField txt = new JTextField(10);
 private String result = new String();
 class MyActionListener implements ActionListener{
  public void actionPerformed(ActionEvent e){
   //각 이벤트에 따른 동작 하기
   if(e.getActionCommand().equals("1")){
    result += "1";
    txt.setText(result);
   }
   if(e.getActionCommand().equals("2")){
    result += "2";
    txt.setText(result);
   }
   if(e.getActionCommand().equals("3")){
    result += "3";
    txt.setText(result);
   }
   if(e.getActionCommand().equals("4")){
    result += "4";
    txt.setText(result);
   }
   if(e.getActionCommand().equals("5")){
    result += "5";
    txt.setText(result);
   }
   if(e.getActionCommand().equals("6")){
    result += "6";
    txt.setText(result);
   }
   if(e.getActionCommand().equals("7")){
    result += "7";
    txt.setText(result);
   }
   if(e.getActionCommand().equals("8")){
    result += "8";
    txt.setText(result);
   }
   if(e.getActionCommand().equals("9")){
    result += "9";
    txt.setText(result);
   }
   if(e.getActionCommand().equals("0")){
    result += "0";
    txt.setText(result);
   }
   if(e.getActionCommand().equals("*")){
    result += "*";
    txt.setText(result);
   }
   if(e.getActionCommand().equals("+")){
    result += "+";
    txt.setText(result);
   }
   if(e.getActionCommand().equals("-")){
    result += "-";
    txt.setText(result);
   }
   if(e.getActionCommand().equals("/")){
    result += "/";
    txt.setText(result);
   }
   if(e.getActionCommand().equals("(")){
    result += "(";
    txt.setText(result);
   }
   if(e.getActionCommand().equals(")")){
    result += ")";
    txt.setText(result);
   }
   if(e.getActionCommand().equals("c")){
    //기존의 Textfield의 내용을 삭제 시켜줌
    result="";
    txt.setText(result);
   }
   if(e.getActionCommand().equals("=")){
    result = txt.getText();
    //1. 괄호 체크
    if(!cal.bracketsBalance(result))
    {
     result = "잘못된 괄호 입니다.";
     txt.setText(result);
     //기존의 Textfield의 내용을 삭제 시켜줌
     result="";
     return;
    }
    //2. 후위 연산으로 바꾼다
    cal.postfix(result);
    //3. 수식이 맞는지 체크 한다
    if(!cal.Lexical())
    {
     result = "잘못된 수식 입니다.";
     txt.setText(result);
     //기존의 Textfield의 내용을 삭제 시켜줌
     result="";
     return;
    }
    // 수식 체크 괄호 체크 후위 연산으로 변경이 모두 이루어 졌으면 계산하여
    //출력 한다
    txt.setText(cal.calc());
    //기존의 Textfield의 내용을 삭제 시켜줌
    result="";
   }
  }
 };

 public void Calulation(){
 
 }
 public void Init(){
  Container cp= getContentPane();
  JPanel cp1= new JPanel();
  cp.add(BorderLayout.NORTH,txt);
  cp1.setLayout(new GridLayout(3,6,7,7));
  //버튼 추가...
  cp1.add(b1);
  cp1.add(b2);
  cp1.add(b3);
  cp1.add(plus);
  cp1.add(min);
  cp1.add(mul);
  cp1.add(b4);
  cp1.add(b5);
  cp1.add(b6);
  cp1.add(dev);
  cp1.add(Lbrackets);
  cp1.add(Rbrackets);
  cp1.add(b7);
  cp1.add(b8);
  cp1.add(b9);
  cp1.add(b0);
  cp1.add(bc);
  cp1.add(equal);
  cp.add(cp1);
 
  //각각의 이벤트 등록...
  b1.addActionListener(new MyActionListener());
  b2.addActionListener(new MyActionListener());
  b3.addActionListener(new MyActionListener());
  b4.addActionListener(new MyActionListener());
  b5.addActionListener(new MyActionListener());
  b6.addActionListener(new MyActionListener());
  b7.addActionListener(new MyActionListener());
  b8.addActionListener(new MyActionListener());
  b9.addActionListener(new MyActionListener());
  b0.addActionListener(new MyActionListener());
  dev.addActionListener(new MyActionListener());
  mul.addActionListener(new MyActionListener());
  min.addActionListener(new MyActionListener());
  plus.addActionListener(new MyActionListener());
  bc.addActionListener(new MyActionListener());
  equal.addActionListener(new MyActionListener());
  Lbrackets.addActionListener(new MyActionListener());
  Rbrackets.addActionListener(new MyActionListener());
 
 }
 public Calculator() {
  addWindowListener(new WindowAdapter() {
   public void windowClosing(WindowEvent e) {
    dispose();
    System.exit(0);
   }
  });
 }
 public static void main(String args[]) {
  Calculator cal = new Calculator();
  cal.Init();
  Console.run(cal,600, 300);
 }
}
 

댓글 없음:

댓글 쓰기