参考了网上的文章,加以修改
核心代码:
private void btnPoi_Click(object sender, EventArgs e)
{
if(!pointKey)
tb.Text += ".";
pointKey = true;
}
private void btn0_Click(object sender, EventArgs e)
{
if (newNum)
{
if (tb.Text[0] != '0' || pointKey)
tb.Text += "0";
else
tb.Text = "0";
}
else
{
tb.Text = "0";
newNum = true;
}
}
private void btnAdd_Click(object sender, EventArgs e)
{
stk.Push(tb.Text); //将第一个运算符前的数据压入stack
while(stk.Count>=3) //当运算的数据超过2个时,先把前两个算出后压入stack
{
decimal y = Convert.ToDecimal(stk.Pop());
char sign = Convert.ToChar(stk.Pop());
decimal x = Convert.ToDecimal(stk.Pop());
switch (sign)
{
case '+':
stk.Push(Convert.ToString(x + y));
break;
case '-':
stk.Push(Convert.ToString(x - y));
break;
case '*':
stk.Push(Convert.ToString(x * y));
break;
case '/':
stk.Push(Convert.ToString(x / y));
break;
}
}
tb.Text = stk.Peek(); //将stack的顶部数据(可能是单一数据,也可能是计算后的数据)取出
stk.Push("+");
reAssignment();
}
private void btnDel_Click(object sender, EventArgs e)
{
string str = tb.Text;
if (str[str.Length - 1] == '.')
{
if (str.Length != 2)
{
string before = str.Substring(0, str.Length - 2);
tb.Text = before + ".";
}
else if (str.Length == 2)
{
tb.Text = "0.";
}
}
else
{
tb.Text = str.Substring(0, str.Length - 1);
}
}
private void btnPoi_Click(object sender, EventArgs e)
{
if(!pointKey)
tb.Text += ".";
pointKey = true;
}
private void btn0_Click(object sender, EventArgs e)
{
if (newNum)
{
if (tb.Text[0] != '0' || pointKey)
tb.Text += "0";
else
tb.Text = "0";
}
else
{
tb.Text = "0";
newNum = true;
}
}