帮我写一个在C90标准下,完成一个四则混合运算并且可以判断括号优先级的程序并且注释每一步,使用顺序栈
时间: 2023-06-09 18:07:27 浏览: 102
好的,我明白了。下面是该程序的实现:
#include <stdio.h>
#include <stdlib.h>
#define STACK_SIZE 100
// 定义一个顺序栈
typedef struct {
int stack[STACK_SIZE];
int top;
} Stack;
// 初始化栈
void initStack(Stack *s) {
s->top = -1;
}
// 判断栈是否为空
int isEmpty(Stack s) {
return s.top == -1;
}
// 判断栈是否已满
int isFull(Stack s) {
return s.top == STACK_SIZE - 1;
}
// 将元素入栈
void push(Stack *s, int data) {
if (isFull(*s)) {
printf("Stack overflow\n");
exit(1);
}
s->stack[++s->top] = data;
}
// 弹出栈顶元素
int pop(Stack *s) {
if (isEmpty(*s)) {
printf("Stack is empty\n");
exit(1);
}
return s->stack[s->top--];
}
// 获取栈顶元素的值
int peek(Stack s) {
if (isEmpty(s)) {
printf("Stack is empty\n");
exit(1);
}
return s.stack[s.top];
}
// 判断是否是数字
int isDigit(char c) {
return c >= '0' && c <= '9';
}
// 计算表达式
int calculate(char op, int a, int b) {
switch (op) {
case '+':
return a + b;
case '-':
return a - b;
case '*':
return a * b;
case '/':
return a / b;
default:
printf("Invalid operator\n");
exit(1);
}
}
// 判断运算符的优先级
int precedence(char op) {
switch (op) {
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
default:
printf("Invalid operator\n");
exit(1);
}
}
// 计算表达式的值
int evaluate(char *expression) {
Stack valueStack; // 存储值的栈
Stack opStack; // 存储运算符的栈
char c; // 当前字符
int value; // 当前数字
int op1, op2; // 当前运算符
int i = 0;
initStack(&valueStack);
initStack(&opStack);
while (expression[i] != '\0') {
c = expression[i];
if (isDigit(c)) { // 如果是数字,则将其转换为实际值
value = c - '0';
while (isDigit(expression[++i])) {
value = value * 10 + (expression[i] - '0');
}
push(&valueStack, value);
} else if (c == '(') { // 如果是左括号,则将其压入运算符栈
push(&opStack, c);
} else if (c == ')') { // 如果是右括号,则弹出运算符栈的运算符并计算
while (peek(opStack) != '(') {
op2 = pop(&valueStack);
op1 = pop(&valueStack);
push(&valueStack, calculate(pop(&opStack), op1, op2));
}
pop(&opStack); // 弹出左括号
} else if (c == '+' || c == '-' || c == '*' || c == '/') { // 如果是运算符,则进行操作
while (!isEmpty(opStack) && precedence(peek(opStack)) >= precedence(c)) {
op2 = pop(&valueStack);
op1 = pop(&valueStack);
push(&valueStack, calculate(pop(&opStack), op1, op2));
}
push(&opStack, c);
}
i++;
}
while (!isEmpty(opStack)) { // 如果还有剩余的运算符,则进行计算
op2 = pop(&valueStack);
op1 = pop(&valueStack);
push(&valueStack, calculate(pop(&opStack), op1, op2));
}
return peek(valueStack); // 返回计算结果
}
// 主函数
int main() {
char expression[100];
printf("请输入一个四则混合运算的表达式:");
gets(expression);
printf("表达式的结果是:%d\n", evaluate(expression));
return 0;
}
此程序使用两个栈实现运算符和操作数的存储和计算。可以正确处理括号的优先级,支持加、减、乘、除等四则运算。同时为了使用方便,每一步都有注释解释其作用。如果您有其他问题,请随时提出,我会尽快回答。
阅读全文