简单计算器实现
输入一组仅包含“+、-、×”在内的算术表达式,比如“3+2×6+8-2”,用C,VC++,C#,VB,Java,APS.NET等任意一种语言,编写程序,
实现:
在运算符组“+,-,×,(,)”内实现算术表达式,比如“(3+2)×6+8-2”,获取正确的计算结果。
思路:
1、利用栈实现,一个栈存储数字N,一个栈存储算数符号P
2、对每一个字符进行扫描,如果是数字,则将其压入N中,若是算数符号,则压入P中。
2.1、首先是数字,对输入的算数表达式进行一个一个扫描,数字都是单个的,需要进行倍乘
// 将连续的数字字符转换为整数并压入数字栈
int number = 0;
while (i < input.Length && char.IsDigit(input[i]))
{
number = number * 10 + (input[i] - '0');//这里的“input[i] - '0'”是ACSII码的差值,也就是imput【i】的值
}
2.2、对于“(”直接压入P栈
对于“)”则需要开始计算,直到P栈栈顶为“(”
2.3、对与±*/则需要与P栈顶的符号优先级进行比较,来确定是进栈还是先对栈内数计算后再进栈。
else if (c == '(')
{
// 直接压入运算符栈
operators.Push(c);
}
// 如果当前字符是右括号 ')'
else if (c == ')')
{
// 在遇到右括号时,持续弹出运算符栈顶的运算符并进行计算,直到遇到左括号为止
while (operators.Peek() != '(')
{
CalculateAndPush(numbers, operators);
}
operators.Pop(); // 弹出左括号
}
// 如果当前字符是运算符
else if (IsOperator(c))
{
// 当前运算符的优先级小于等于栈顶运算符优先级时,弹出栈顶运算符并进行计算,直到栈顶运算符优先级更低或栈为空
while (operators.Count > 0 && Precedence(c) <= Precedence(operators.Peek()))
{
CalculateAndPush(numbers, operators);
}
// 将当前运算符压入栈
operators.Push(c);
}
}
2.4、最后是计算函数
取N栈顶上两个数和P栈顶上一个算出运算符进行计算
// 私有辅助方法,用于执行两个数字的运算并将结果压回数字栈
private static void CalculateAndPush(Stack<int> numbers, Stack<char> operators)
{
int right = numbers.Pop(); // 弹出栈顶数字作为右侧操作数
int left = numbers.Pop(); // 弹出新的栈顶数字作为左侧操作数
char op = operators.Pop(); // 弹出栈顶运算符
// 根据运算符执行相应的计算
switch (op)
{
case '+':
numbers.Push(left + right);
break;
case '-':
numbers.Push(left - right);
break;
case '*':
numbers.Push(left * right);
break;
case '/':
numbers.Push(left / right); // 注意:这里没有处理除数为0的情况
break;
}
}
全部代码在下载中,供参考
该文章主要介绍一种栈的使用思路,并不完善,可以加入诸多验证规则或支持浮点等。