I had to make a calculator using stacks. Here is what i have so far. For some reason, the equal sign doesn't work. Can someone help me fix this. The code shows no error,
import java.awt.*; import javax.swing.Box; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; import java.util.*; public class Calculator extends JFrame implements ActionListener { public static void main(String args[]) { Calculator cal=new Calculator(); } String numbers[]={"0","1","2","3","4","5","6","7","8","9","+","-","*","/",".","CE","C","=","+/-"}; JButton button[]=new JButton[19]; Panel p[]=new Panel[6]; TextField text; Box box; FlowLayout fv; public Calculator() { this.setDefaultCloseOperation(EXIT_ON_CLOSE); box=Box.createVerticalBox(); fv=new FlowLayout(); fv.setVgap(20); this.setLocationRelativeTo(null); for(int i=0;i<numbers.length;i++) { button[i]=new JButton(numbers[i]); button[i].addActionListener(this); if(i!=15&&i!=16) { button[i].setPreferredSize(new Dimension(55,35)); } else { button[i].setPreferredSize(new Dimension(85,35)); } if(i<6) { p[i]=new Panel(); box.add(p[i]); } if(i==0) { text=new TextField("0",30); p[0].add(text); } } //ADDS Buttons p[1].add(button[7]);p[1].add(button[8]);p[1].add(button[9]);p[1].add(button[10]); //7,8,9,+ p[2].add(button[4]);p[2].add(button[5]);p[2].add(button[6]);p[2].add(button[11]); //4,5,6,- p[3].add(button[1]);p[3].add(button[2]);p[3].add(button[3]);p[3].add(button[12]); //1,2,3, * p[4].add(button[0]);p[4].add(button[14]);p[4].add(button[18]);p[4].add(button[13]); //0,., +/-, / p[5].add(button[15]);p[5].add(button[16]);p[5].add(button[17]); //CE, C, = this.add(box); this.setBounds(520,200,280,320); this.setResizable(false); this.setVisible(true); this.validate(); } int press=0; int press1=0; int press2=0; int strlen=0; StringBuffer op1=new StringBuffer("0"); StringBuffer op2=new StringBuffer("0"); String str; String[] tokens; double result; Stack<Double> operands = new Stack(); Stack<String> operators = new Stack(); double sum1=0; public void actionPerformed(ActionEvent e){ //display numbers if(e.getSource()==button[0]) { this.displayNumber(0); } if(e.getSource()==button[1]) { this.displayNumber(1); } if(e.getSource()==button[2]) { this.displayNumber(2); } if(e.getSource()==button[3]) { this.displayNumber(3); } if(e.getSource()==button[4]) { this.displayNumber(4); } if(e.getSource()==button[5]) { this.displayNumber(5); } if(e.getSource()==button[6]) { this.displayNumber(6); } if(e.getSource()==button[7]) { this.displayNumber(7); } if(e.getSource()==button[8]) { this.displayNumber(8); } if(e.getSource()==button[9]) { this.displayNumber(9); } //other variables if(e.getSource()==button[10]) // + { this.pressOperator(10); } if(e.getSource()==button[11]) // - { this.pressOperator(11); } if(e.getSource()==button[12]) // * { this.pressOperator(12); } if(e.getSource()==button[13]) //divide { this.pressOperator(13); } if(e.getSource()==button[14]) // decimal . { if(op1.charAt(op1.length()-1)!='+'&&op1.charAt(op1.length()-1)!='-'&&op1.charAt(op1.length()-1)!='*'&&op1.charAt(op1.length()-1)!='/'&&press!=1) { op1.append(button[14].getText()); op2.append(button[14].getText()); text.setText(op1.toString()); press=1; } } if(e.getSource()==button[18]) // plus or minus+/- { if(op1.charAt(op1.length()-1)!='+'&&op1.charAt(op1.length()-1)!='-'&&op1.charAt(op1.length()-1)!='*'&&op1.charAt(op1.length()-1)!='/') { if(press2==0) { op1.insert(strlen, "-"); op2.insert(strlen, "@"); text.setText(op1.toString()); press2=1; } else { op1.deleteCharAt(strlen); op2.deleteCharAt(strlen); text.setText(op1.toString()); press2=0; } } } if(e.getSource()==button[15]) // CE { if(strlen!=0) { op1.delete(strlen, op1.length()); op2.delete(strlen, op2.length()); text.setText(op1.toString()); } else { op1.delete(0,op1.length()); op2.delete(0,op2.length()); op1.append("0"); op2.append("0"); text.setText(op1.toString()); press=0; press2=0; } } if(e.getSource()==button[16]) // C { op1.delete(0, op1.length()); op2.delete(0, op2.length()); op1.append("0"); op2.append("0"); text.setText(op1.toString()); press=0; press1=0; press2=0; strlen=0; } if(e.getSource()==button[17]) // Equals = { if(op1.charAt(op1.length()-1)!='+'&&op1.charAt(op1.length()-1)!='-'&&op1.charAt(op1.length()-1)!='*'&&op1.charAt(op1.length()-1)!='/'&&press!=1) { calculate(operands,operators); } } } public void pressOperator(int i) { if(op1.charAt(op1.length()-1)!='+'&&op1.charAt(op1.length()-1)!='-'&&op1.charAt(op1.length()-1)!='*'&&op1.charAt(op1.length()-1)!='/'&&op1.charAt(op1.length()-1)!='.') { op1.append(button[i].getText()); op2.append(button[i].getText()); text.setText(op1.toString()); press=0; press1=1; press2=0; strlen=op1.length(); } } public void displayNumber(int i) ///number display to box { if(press1!=1&&press!=1&&op1.charAt(0)=='0') { op1.replace(0, 1,button[i].getText()); op2.replace(0, 1,button[i].getText()); text.setText(op1.toString()); } else { op1.append(button[i].getText()); op2.append(button[i].getText()); text.setText(op1.toString()); } } private static double add(Stack<Double> stk) { double op2 = stk.pop(); double op1 = stk.pop(); double result = op1 + op2; stk.push(result); return result; }// end add private static double subtract(Stack<Double> stk) { double op2 = stk.pop(); double op1 = stk.pop(); double result = op1 - op2; stk.push(result); return result; }// end subtract private static double divide(Stack<Double> stk) { double op2 = stk.pop(); double op1 = stk.pop(); double result = op1 / op2; stk.push(result); return result; }//end divide private static double multiply(Stack<Double> stk) { double op2 = stk.pop(); double op1 = stk.pop(); double result = op1 * op2; stk.push(result); return result; }//end multiply /**perform calculations based on operators, loop until operator stack is empty*/ private static double calculate(Stack<Double> stkd, Stack<String> stks) { double result = 0; String str = ""; while(!stks.empty()) { str = stks.pop(); if(str.equals("+")) result = add(stkd); else if(str.equals("-")) result = subtract(stkd); else if(str.equals("/")) result = divide(stkd); else if(str.equals("*")) result = multiply(stkd); }//end while return result; } }