栈实现小小计算器~(存在问题,希望高手指点~感谢之至)

用栈实现的简单计算器,有一个很大的问题,希望指点。

问题:连续计算中点了“=”之后的结果,不能继续参与运算。

这个是运算符代码

Operators
1 //运算符类,实现加减乘除
2  enum OperatorType
3 {
4 Add,
5 Sub,
6 Mul,
7 Div,
8 equ
9 }
10
11 staticclass Operators
12 {
13
14 //加法
15  publicstaticstring Add(string a, string b)
16 {
17 double aa =double.Parse(a);
18 double bb =double.Parse(b);
19
20 return (aa + bb).ToString();
21 }
22
23 //减法
24  publicstaticstring Sub(string a, string b)
25 {
26 double aa =double.Parse(a);
27 double bb =double.Parse(b);
28
29 return (aa - bb).ToString();
30 }
31
32 //乘法
33  publicstaticstring Mul(string a, string b)
34 {
35 double aa =double.Parse(a);
36 double bb =double.Parse(b);
37
38 return (aa * bb).ToString();
39 }
40
41 //除法
42  publicstaticstring Div(string a, string b)
43 {
44 double aa =double.Parse(a);
45 double bb =double.Parse(b);
46
47 return (aa / bb).ToString();
48 }
49 }

 

核心代码:

Calculator_Mine
1 namespace Calculator_Mine
2 {
3 //超新手编程,程序较弱智,希望高手指点
4 //主题思想:用两个栈,一个用于存数值,一个存运算符
5 //计算器只能实现连续运算,就是输入一个数值、点一个运算符、再输入数值、再点运算符……
6 //存在问题:运算过程中点了“=”得出的结果不能继续参加运算,希望高手支招。
7  publicpartialclass Calculator : Form
8 {
9 //用于标记第二个运算符
10 bool another;
11 //存储临时运算符
12 string temp;
13
14 //定义两个栈
15 private Stack<string> Stk_Num =new Stack<string>();
16 private Stack<string> Stk_Oper =new Stack<string>();
17
18 public Calculator()
19 {
20 InitializeComponent();
21 }
22 //将小数点单独拿出来,因为需要判定小数点在一个数中只能点一次
23 privatevoid btn_p_Click(object sender, EventArgs e)
24 {
25
26 if (!Num_Box.Text.Contains("."))
27 {
28 Num_Box.Text += btn_p.Text;
29 }
30 another =false;
31 }
32
33 //输入数字触发的事件
34 privatevoid Num_btn_click(object sender, EventArgs e)
35 {
36 Button btn = sender as Button;
37 if (another)
38 {
39 Num_Box.Text ="0";
40 }
41
42 if (Num_Box.Text =="0")
43 {
44 Num_Box.Text ="";
45 }
46
47 Num_Box.Text += btn.Text;
48 }
49
50 //输入运算符触发的事件
51 privatevoid Operator_btn_click(object sender, EventArgs e)
52 {
53 Button oper_btn = sender as Button;
54
55 another =true;
56
57 //压栈
58 Stk_Num.Push(Num_Box.Text);
59 Stk_Oper.Push(oper_btn.Text);
60
61 //点第二个运算符时触发的事件
62 if (Stk_Oper.Count >1)
63 {
64 temp = Stk_Oper.Pop();
65
66 string right_num = Stk_Num.Pop();
67
68 //对第一个运算符进行运算
69 switch (Stk_Oper.Pop())
70 {
71 case ("+"):
72 Num_Box.Text = Operators.Add(Stk_Num.Pop(), right_num);
73 Stk_Num.Push(Num_Box.Text);
74 Stk_Oper.Push(temp);
75 break;
76 case ("-"):
77 Num_Box.Text = Operators.Sub(Stk_Num.Pop(), right_num);
78 Stk_Num.Push(Num_Box.Text);
79 Stk_Oper.Push(temp);
80 break;
81 case ("*"):
82 Num_Box.Text = Operators.Mul(Stk_Num.Pop(), right_num);
83 Stk_Num.Push(Num_Box.Text);
84 Stk_Oper.Push(temp);
85 break;
86 case ("/"):
87 Num_Box.Text = Operators.Div(Stk_Num.Pop(), right_num);
88 Stk_Num.Push(Num_Box.Text);
89 Stk_Oper.Push(temp);
90 break;
91 case ("="):
92 Num_Box.Text = Stk_Num.Pop();
93 Stk_Oper.Clear();
94 break;
95 }
96 }
97
98 }
99 //正负号
100 privatevoid btn__Click(object sender, EventArgs e)
101 {
102 if (double.Parse(Num_Box.Text) >0)
103 {
104 Num_Box.Text ="-"+ Num_Box.Text;
105 }
106 else
107 {
108 if (double.Parse(Num_Box.Text) !=0)
109 {
110 Num_Box.Text = Num_Box.Text.Substring(1, Num_Box.Text.Length -1);
111 }
112 }
113 }
114
115 //CE按钮
116 privatevoid btn_clear_Click(object sender, EventArgs e)
117 {
118 Num_Box.Text ="0";
119 Stk_Num.Clear();
120 Stk_Oper.Clear();
121 temp ="";
122 another =false;
123 }
124
125
126 }
127 }

希望有高手指导一下~

posted on 2011-04-03 16:30  小猪同学  阅读(366)  评论(0编辑  收藏  举报

导航