返回
后缀表达式计算:揭秘高效代码实现的奥秘
闲谈
2023-11-04 18:47:17
后缀表达式的概念和特性
后缀表达式,也称为逆波兰表示法,是一种运算符在操作数之后的表达式表示方法。这种表示方法具有以下特点:
- 简洁:后缀表达式不需要括号来指定运算符的优先级,因此更加简洁明了。
- 易于计算机计算:由于后缀表达式中运算符的位置固定,因此计算机可以很容易地进行计算。
后缀表达式的计算过程
计算后缀表达式通常使用栈数据结构。栈是一种先进后出的数据结构,可以方便地存储和检索数据。
- 将后缀表达式中的元素依次压入栈中。
- 当遇到一个操作数时,将其压入栈中。
- 当遇到一个运算符时,从栈中弹出两个操作数,进行运算,并将结果压入栈中。
- 重复步骤2和步骤3,直到将所有元素处理完毕。
- 栈顶元素即为后缀表达式的计算结果。
用C语言实现后缀表达式计算器
下面是一个用C语言实现的后缀表达式计算器的代码:
#include <stdio.h>
#include <stdlib.h>
// 定义栈的数据结构
typedef struct stack
{
int *data;
int top;
int size;
} stack;
// 初始化栈
void init_stack(stack *s)
{
s->data = (int *)malloc(sizeof(int) * 100);
s->top = -1;
s->size = 100;
}
// 入栈
void push(stack *s, int data)
{
if (s->top == s->size - 1)
{
printf("栈已满!\n");
return;
}
s->data[++s->top] = data;
}
// 出栈
int pop(stack *s)
{
if (s->top == -1)
{
printf("栈已空!\n");
return -1;
}
return s->data[s->top--];
}
// 计算后缀表达式
int evaluate_postfix(char *exp)
{
stack s;
init_stack(&s);
int i = 0;
while (exp[i] != '\0')
{
if (exp[i] >= '0' && exp[i] <= '9')
{
push(&s, exp[i] - '0');
}
else
{
int op1 = pop(&s);
int op2 = pop(&s);
switch (exp[i])
{
case '+':
push(&s, op1 + op2);
break;
case '-':
push(&s, op2 - op1);
break;
case '*':
push(&s, op1 * op2);
break;
case '/':
push(&s, op2 / op1);
break;
}
}
i++;
}
return pop(&s);
}
int main()
{
char exp[] = "231*+9-";
int result = evaluate_postfix(exp);
printf("后缀表达式 '%s' 的计算结果为:%d\n", exp, result);
return 0;
}
代码讲解
- 定义栈的数据结构:
typedef struct stack
{
int *data;
int top;
int size;
} stack;
- 初始化栈:
void init_stack(stack *s)
{
s->data = (int *)malloc(sizeof(int) * 100);
s->top = -1;
s->size = 100;
}
- 入栈:
void push(stack *s, int data)
{
if (s->top == s->size - 1)
{
printf("栈已满!\n");
return;
}
s->data[++s->top] = data;
}
- 出栈:
int pop(stack *s)
{
if (s->top == -1)
{
printf("栈已空!\n");
return -1;
}
return s->data[s->top--];
}
- 计算后缀表达式:
int evaluate_postfix(char *exp)
{
stack s;
init_stack(&s);
int i = 0;
while (exp[i] != '\0')
{
if (exp[i] >= '0' && exp[i] <= '9')
{
push(&s, exp[i] - '0');
}
else
{
int op1 = pop(&s);
int op2 = pop(&s);
switch (exp[i])
{
case '+':
push(&s, op1 + op2);
break;
case '-':
push(&s, op2 - op1);
break;
case '*':
push(&s, op1 * op2);
break;
case '/':
push(&s, op2 / op1);
break;
}
}
i++;
}
return pop(&s);
}
- 主函数:
int main()
{
char exp[] = "231*+9-";
int result = evaluate_postfix(exp);
printf("后缀表达式 '%s' 的计算结果为:%d\n", exp, result);
return 0;
}

扫码关注微信公众号
C++ 模板机制揭秘:轻松驾驭复杂编程

迎战 2024:2023 年终总结与新征程展望

漫谈减肥与恋爱:盘点2023年度的得与失

{ font-size: 36px; font-weight: bold; text-align: center; } #description { font-size: 16px; text-align: justify; } #keywords { font-size: 12px; text-align: justify; } </style> </head> <body> <div id="container"> 在平淡中书写人生的华章:平凡人生里的精彩故事

千里之行始于发心:发现成功旅程的第一步
