运行结果演示
基本思路
基本结构
键盘数据读入
运算实现原理
为了实现复杂的四则运算,首先需要考虑的是算数符号以及括号的优先级。具体实现流程如下:
- 如果是数字,则压入操作数栈中
- 如果是运算符,则有两种情况:
①如果运算符栈为空,则将其压入运算符栈中
②如果不为空,则比较其与运算符栈中的优先级,如果大于则压入栈中,否则从操作数栈中取出两个数进行相应计算 - 如果为* ) * ,取出操作数栈中两个数与运算符栈中运算符计算,结果压入操作数栈中。直至遇到* )*
- 将剩余操作数与运算符进行运算,直至操作数栈为空
实现准备
为了实现运算,需要准备简单的栈结构及其基本操作:
/*
简易栈实现
*/
int stackNum[255] = {
0 };
int stackNumTopIndex = -1;
char stackChar[255] = {
};
int stackCharTopIndex = -1;
void pushNumStack(int num) {
stackNum[++stackNumTopIndex] = num;
}
void pushCharStack(char op)
{
stackChar[++stackCharTopIndex] = op;
}
bool isEmptyOfNumStack()
{
return stackNumTopIndex == -1;
}
bool isEmptyOfCharStack()
{
return stackCharTopIndex == -1;
}
int popNumStack() {
if (isEmptyOfNumStack()) {
return -1;
}
return stackNum[stackNumTopIndex--];
}
char popCharStack()
{
if (isEmptyOfCharStack()) {
return '!';
}
return stackChar[stackCharTopIndex--];
}
int peekNumStack()
{
return stackNum[stackNumTopIndex];
}
int peekCharStack()
{
return stackChar[stackCharTopIndex];
}
接着,实现对数据的一些基本功能函数
/*
* 数据处理
*/
//获取算数符号优先级
int getPriority(char op)
{
int level = 0;
switch (op)
{
case '(':
level = 1;
break;
case '+':
case '-':
level = 2;
break;
case '*':
case '/':
level = 3;
break;
default:
break;
}
return level;
}
//是否是算数运算符
bool isOperator(char op)
{
if ( op== '+' || op == '-' || op == '*' || op == '/') {
return true;
}
else {
return false;
}
}
//进行相应计算
int Calculate(int lNum, char op, int rNum)
{
int result = 0;
switch (op)
{
case '+':
result = lNum + rNum;
break;
case '-':
result = lNum - rNum;
break;
case '*':
result = lNum * rNum;
break;
case '/':
if (rNum != 0) {
result = lNum / rNum;
}
break;
default