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.
Related Questions
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.