用c语言实现实现栈的应用表达式求值 采用顺序栈实现表达式求值 从运行界面输入一个表达式c 该表达式包括加法 减法 乘法 除法
时间: 2024-02-17 16:03:32 浏览: 83
好的,我可以为您解答这个问题。
首先,我们需要定义一个顺序栈的结构体:
```c
#define MAXSIZE 100 // 栈的最大长度
typedef struct {
double data[MAXSIZE]; // 存放栈中的数据
int top; // 栈顶指针
} SqStack;
```
然后,我们需要实现一个入栈操作:
```c
int Push(SqStack *S, double e) {
if (S->top == MAXSIZE - 1) { // 栈满
return 0;
}
S->top++; // 栈顶指针加一
S->data[S->top] = e; // 将元素 e 压入栈中
return 1;
}
```
接着,我们需要实现一个出栈操作:
```c
int Pop(SqStack *S, double *e) {
if (S->top == -1) { // 栈空
return 0;
}
*e = S->data[S->top]; // 将栈顶元素出栈
S->top--; // 栈顶指针减一
return 1;
}
```
接下来,我们需要实现一个取栈顶元素的操作:
```c
int GetTop(SqStack *S, double *e) {
if (S->top == -1) { // 栈空
return 0;
}
*e = S->data[S->top]; // 将栈顶元素赋值给 e
return 1;
}
```
最后,我们可以使用顺序栈来实现表达式求值。具体的实现方法如下:
首先,我们需要将表达式转换成后缀表达式。这里我使用了一个字符数组来存放后缀表达式:
```c
char postfix[MAXSIZE]; // 存放后缀表达式
```
然后,我们需要实现一个函数来将中缀表达式转换成后缀表达式:
```c
int InfixToPostfix(char *infix, char *postfix) {
SqStack S;
InitStack(&S); // 初始化栈
int i = 0, j = 0; // i 为中缀表达式的下标,j 为后缀表达式的下标
while (infix[i] != '\0') { // 遍历中缀表达式
if (isdigit(infix[i])) { // 如果是数字,直接加入后缀表达式
postfix[j++] = infix[i++];
} else if (infix[i] == '(') { // 如果是左括号,入栈
Push(&S, infix[i++]);
} else if (infix[i] == ')') { // 如果是右括号,将栈中的运算符弹出并加入后缀表达式,直到遇到左括号
char c;
while (Pop(&S, &c) && c != '(') {
postfix[j++] = c;
}
if (c != '(') { // 如果没有遇到左括号,说明表达式有误
return 0;
}
i++;
} else if (infix[i] == '+' || infix[i] == '-' || infix[i] == '*' || infix[i] == '/') { // 如果是运算符
char c;
while (GetTop(&S, &c) && c != '(' && (infix[i] == '*' || infix[i] == '/' || c == '+' || c == '-')) { // 弹出栈中优先级高于或等于当前运算符的运算符,并加入后缀表达式
Pop(&S, &c);
postfix[j++] = c;
}
Push(&S, infix[i++]); // 当前运算符入栈
} else { // 如果是非法字符,返回错误
return 0;
}
}
while (Pop(&S, &c)) { // 将栈中剩余的运算符弹出并加入后缀表达式
postfix[j++] = c;
}
postfix[j] = '\0'; // 后缀表达式以 '\0' 结尾
return 1;
}
```
接着,我们可以使用顺序栈来计算后缀表达式的值:
```c
double Calculate(char *postfix) {
SqStack S;
InitStack(&S); // 初始化栈
int i = 0;
while (postfix[i] != '\0') { // 遍历后缀表达式
if (isdigit(postfix[i])) { // 如果是数字,入栈
Push(&S, postfix[i++] - '0');
} else { // 如果是运算符,从栈中弹出两个操作数进行计算
double a, b;
Pop(&S, &b);
Pop(&S, &a);
switch (postfix[i++]) {
case '+':
Push(&S, a + b);
break;
case '-':
Push(&S, a - b);
break;
case '*':
Push(&S, a * b);
break;
case '/':
if (b == 0) { // 如果除数为零,返回错误
return 0;
}
Push(&S, a / b);
break;
default: // 如果是非法字符,返回错误
return 0;
}
}
}
double result;
Pop(&S, &result); // 最终栈中只剩下一个元素,就是表达式的值
return result;
}
```
最后,我们可以在主函数中调用上述函数来实现表达式求值:
```c
int main() {
char infix[MAXSIZE];
printf("请输入一个表达式:");
scanf("%s", infix);
char postfix[MAXSIZE];
if (!InfixToPostfix(infix, postfix)) {
printf("表达式有误!\n");
return 0;
}
double result = Calculate(postfix);
printf("表达式的值为:%g\n", result);
return 0;
}
```
这样,我们就完成了用 C 语言实现栈的应用表达式求值的任务。
阅读全文