zoukankan      html  css  js  c++  java
  • 栈实现小小计算器~(存在问题,希望高手指点~感谢之至)

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

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

    这个是运算符代码

    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 }

    希望有高手指导一下~

  • 相关阅读:
    day19 反射
    Oracle函数整理
    在博客园设置访问人数
    数据库中行转列
    Oracle中数据库与实例的区别
    sql语句的执行顺序
    【地址】ps_cs6安装
    ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务 的解决方法
    人员管理模块密码过期
    相关性配置模块总结
  • 原文地址:https://www.cnblogs.com/zhuyuchen/p/2004469.html
Copyright © 2011-2022 走看看