用栈编写表达式求值C语言不使用主函数
时间: 2024-02-20 21:56:37 浏览: 29
以下是使用栈来编写表达式求值的C语言代码,不包括主函数:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_STACK_SIZE 100
typedef struct {
int top; // 栈顶指针
int data[MAX_STACK_SIZE]; // 栈数据
} Stack;
void init(Stack *s) {
s->top = -1;
}
int is_empty(Stack *s) {
return s->top == -1;
}
int is_full(Stack *s) {
return s->top == MAX_STACK_SIZE - 1;
}
void push(Stack *s, int x) {
if (is_full(s)) {
printf("Stack overflow\n");
exit(1);
}
s->data[++s->top] = x;
}
int pop(Stack *s) {
if (is_empty(s)) {
printf("Stack underflow\n");
exit(1);
}
return s->data[s->top--];
}
int peek(Stack *s) {
if (is_empty(s)) {
printf("Stack underflow\n");
exit(1);
}
return s->data[s->top];
}
int evaluate_expression(char *exp) {
Stack operand_stack;
Stack operator_stack;
init(&operand_stack);
init(&operator_stack);
char *p = exp;
while (*p != '\0') {
if (*p >= '0' && *p <= '9') {
int operand = 0;
while (*p >= '0' && *p <= '9') {
operand = operand * 10 + (*p - '0');
p++;
}
push(&operand_stack, operand);
} else if (*p == '(') {
push(&operator_stack, *p);
p++;
} else if (*p == ')') {
while (peek(&operator_stack) != '(') {
int op2 = pop(&operand_stack);
int op1 = pop(&operand_stack);
char op = pop(&operator_stack);
int result;
switch (op) {
case '+':
result = op1 + op2;
break;
case '-':
result = op1 - op2;
break;
case '*':
result = op1 * op2;
break;
case '/':
result = op1 / op2;
break;
default:
printf("Invalid operator\n");
exit(1);
}
push(&operand_stack, result);
}
pop(&operator_stack);
p++;
} else if (*p == '+' || *p == '-') {
while (!is_empty(&operator_stack) && peek(&operator_stack) != '(') {
int op2 = pop(&operand_stack);
int op1 = pop(&operand_stack);
char op = pop(&operator_stack);
int result;
switch (op) {
case '+':
result = op1 + op2;
break;
case '-':
result = op1 - op2;
break;
case '*':
result = op1 * op2;
break;
case '/':
result = op1 / op2;
break;
default:
printf("Invalid operator\n");
exit(1);
}
push(&operand_stack, result);
}
push(&operator_stack, *p);
p++;
} else if (*p == '*' || *p == '/') {
while (!is_empty(&operator_stack) && (peek(&operator_stack) == '*' || peek(&operator_stack) == '/')) {
int op2 = pop(&operand_stack);
int op1 = pop(&operand_stack);
char op = pop(&operator_stack);
int result;
switch (op) {
case '+':
result = op1 + op2;
break;
case '-':
result = op1 - op2;
break;
case '*':
result = op1 * op2;
break;
case '/':
result = op1 / op2;
break;
default:
printf("Invalid operator\n");
exit(1);
}
push(&operand_stack, result);
}
push(&operator_stack, *p);
p++;
} else {
printf("Invalid character\n");
exit(1);
}
}
while (!is_empty(&operator_stack)) {
int op2 = pop(&operand_stack);
int op1 = pop(&operand_stack);
char op = pop(&operator_stack);
int result;
switch (op) {
case '+':
result = op1 + op2;
break;
case '-':
result = op1 - op2;
break;
case '*':
result = op1 * op2;
break;
case '/':
result = op1 / op2;
break;
default:
printf("Invalid operator\n");
exit(1);
}
push(&operand_stack, result);
}
return pop(&operand_stack);
}
```
使用该代码可以计算简单的算术表达式,例如 `2+3*4-5/2`。
相关推荐
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)