利用这几个函数写出计算器(1)void initstack():初始化栈 (2)int Make_str():语法检查并计算 (3)int push_operator(int operator):将运算符压入栈 (4)int push_num(double num):将运算数压入栈 (5)int procede(int operator):处理运算符 (6)int change_opnd(int operator):将字符型运算符转换成优先级 (7)int push_opnd(int operator):将运算符压入栈 (8)int pop_opnd():将运算符弹出栈 (9)int caculate(int cur_opnd):简单计算+,-,*,/ (10)double pop_num():弹出运算数
时间: 2023-12-10 21:04:13 浏览: 74
好的,我可以为你提供这几个函数的使用方法和计算器的具体实现流程,具体如下:
函数1:void initstack():初始化栈
该函数主要是用来初始化栈,即将栈顶指针初始化为-1,表示栈为空。具体实现代码如下:
```
void initstack() {
top = -1;
}
```
函数2:int Make_str():语法检查并计算
该函数主要是用来进行语法检查和计算,具体实现流程如下:
(1)从左到右遍历表达式中的每个字符。
(2)如果当前字符是数字,则将其转为double类型,并将其入操作数栈。
(3)如果当前字符是运算符,则将其转为优先级,并将其入运算符栈。
(4)如果当前字符是右括号,则弹出运算符栈中的运算符和操作数栈中的操作数,进行计算,并将结果入操作数栈,直到遇到左括号。
(5)最后,将操作数栈中剩余的操作数进行计算,得到最终结果。
具体实现代码如下:
```
int Make_str(char *str) {
initstack();
char ch;
int i = 0;
double num;
int cur_opnd, pre_opnd;
while ((ch = str[i++]) != '\0') {
if (isdigit(ch)) {
num = ch - '0';
while (isdigit(ch = str[i++])) {
num = num * 10 + ch - '0';
}
push_num(num);
}
if (ch == '+' || ch == '-' || ch == '*' || ch == '/') {
cur_opnd = change_opnd(ch);
if (top == -1 || cur_opnd > opnd[top]) {
push_operator(cur_opnd);
} else {
pre_opnd = pop_opnd();
while (pre_opnd != -1 && cur_opnd <= pre_opnd) {
caculate(pre_opnd);
pre_opnd = pop_opnd();
}
push_operator(cur_opnd);
}
}
if (ch == '(') {
push_opnd(ch);
}
if (ch == ')') {
pre_opnd = pop_opnd();
while (pre_opnd != '(') {
caculate(pre_opnd);
pre_opnd = pop_opnd();
}
}
}
while (top != -1) {
caculate(pop_opnd());
}
return pop_num();
}
```
函数3:int push_operator(int operator):将运算符压入栈
该函数主要是用来将运算符压入栈中,具体实现代码如下:
```
int push_operator(int operator) {
top++;
opnd[top] = operator;
return 0;
}
```
函数4:int push_num(double num):将运算数压入栈
该函数主要是用来将运算数压入栈中,具体实现代码如下:
```
int push_num(double num) {
top++;
opnum[top] = num;
return 0;
}
```
函数5:int procede(int operator):处理运算符
该函数主要是用来处理运算符,将栈中的运算符和操作数进行计算,并将结果入操作数栈中,具体实现代码如下:
```
int procede(int operator) {
double num1, num2;
num2 = pop_num();
num1 = pop_num();
switch (operator) {
case 0:
push_num(num1 + num2);
break;
case 1:
push_num(num1 - num2);
break;
case 2:
push_num(num1 * num2);
break;
case 3:
push_num(num1 / num2);
break;
default:
break;
}
return 0;
}
```
函数6:int change_opnd(int operator):将字符型运算符转换成优先级
该函数主要是用来将字符型运算符转换成优先级,具体实现代码如下:
```
int change_opnd(int operator) {
switch (operator) {
case '+':
return 0;
case '-':
return 1;
case '*':
return 2;
case '/':
return 3;
default:
break;
}
return -1;
}
```
函数7:int push_opnd(int operator):将运算符压入栈
该函数主要是用来将运算符压入栈中,具体实现代码如下:
```
int push_opnd(int operator) {
top++;
opnd[top] = operator;
return 0;
}
```
函数8:int pop_opnd():将运算符弹出栈
该函数主要是用来将运算符弹出栈中,具体实现代码如下:
```
int pop_opnd() {
int operator;
if (top == -1) {
return -1;
}
operator = opnd[top];
top--;
return operator;
}
```
函数9:int caculate(int cur_opnd):简单计算+,-,*,/
该函数主要是用来进行简单计算,包括加、减、乘、除四种操作,具体实现代码如下:
```
int caculate(int cur_opnd) {
while (cur_opnd <= opnd[top] && top != -1) {
procede(pop_opnd());
}
push_operator(cur_opnd);
return 0;
}
```
函数10:double pop_num():弹出运算数
该函数主要是用来将运算数弹出栈中,具体实现代码如下:
```
double pop_num() {
double num;
if (top == -1) {
return -1;
}
num = opnum[top];
top--;
return num;
}
```
综上所述,以上这些函数可以组合在一起,实现一个简单的计算器,实现对算数表达式的求值功能。
阅读全文