Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

I had to make a calculator using stacks. Here is what i have so far. For some re

ID: 3658675 • Letter: I

Question

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;

}

}

Explanation / Answer

this code is correct.