C语言 实现后缀表达式求值(理解不同方式)

写在前面

        在数据结构中,栈是非常重要的储存结构,比如栈应用于求表达式,将输入的等式进行转换,如前缀表达式、后缀表达式等然后进行求值并返回结果。

        但是本文并为使用栈实现后缀表达式求值,而是通过一般函数方法,需要先计算一下,将原式转换成后缀表达式后再输入求值哦,试试看。

代码实现

#include <stdio.h>
#include <stdlib.h>

void evalPf(char*);
double cal(double, char, double);

int main(){
	char input[80];
	printf("请输入后缀式:\n\n"); 
	printf("例如:\n算式 (1+2)*(3+4) 的后缀式为:12+34+*  \n\n"); 
	scanf("%s", input); 
	evalPf(input);
	return 0;
}

void evalPf(char* postfix){ 
	double stack[80] = {0.0}; 
	char temp[2];
	char token;
	int top = 0, i = 0;
	temp[1] = '\0';
	while(1){
		token = postfix[i];
		switch(token){
			case '\0':
				printf("原式 = %f\n", stack[top]); 
				return;
			case '+': 
			case '-': 
			case '*': 
			case '/': 
				stack[top-1] =cal(stack[top], token, stack[top-1]);
				top--; 
				break;
			default:
				if(top < sizeof(stack) / sizeof(float)){ 
					temp[0] = postfix[i];
					top++;
					stack[top] = atof(temp);
				}
				break;
		}
		i++;
	}
}
	

double cal(double p1, char op, double p2){ 
	switch(op){
		case '+':
			return p1 + p2;
		case '-':
			return p1 - p2; 
		case '*':
			return p1 * p2;
		case '/':
			return p1 / p2;
	}
}

运行结果

 

  • 5
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
后缀表达式求值可以使用栈来完成。具体实现过程如下: 1. 定义一个栈结构体,存储数据和栈顶指针。 ```c typedef struct stack { int data[MAX_SIZE]; int top; } Stack; ``` 2. 定义一个函数,用于判断一个字符是否为数字。 ```c int isDigit(char c) { return (c >= '0' && c <= '9'); } ``` 3. 定义一个函数,用于将后缀表达式字符串转换成整数。 ```c int toInt(char* str) { int res = 0; for (int i = 0; str[i] != '\0'; i++) { res = res * 10 + (str[i] - '0'); } return res; } ``` 4. 定义一个函数,用于计算两个数的加、减、乘、除。 ```c int calc(int a, int b, char op) { switch (op) { case '+': return a + b; case '-': return a - b; case '*': return a * b; case '/': return a / b; default: return 0; } } ``` 5. 定义一个函数,用于计算后缀表达式的值。 ```c int eval(char* expr) { Stack s; s.top = -1; for (int i = 0; expr[i] != '\0'; i++) { if (isDigit(expr[i])) { // 如果是数字,将其转换成整数并入栈 int num = toInt(&expr[i]); s.data[++s.top] = num; // 将 i 移动到数字串的末尾 while (isDigit(expr[i])) { i++; } i--; } else { // 如果是操作符,弹出栈顶的两个数进行运算,并将结果入栈 int b = s.data[s.top--]; int a = s.data[s.top--]; int res = calc(a, b, expr[i]); s.data[++s.top] = res; } } return s.data[s.top]; } ``` 完整代码如下: ```c #include <stdio.h> #define MAX_SIZE 100 typedef struct stack { int data[MAX_SIZE]; int top; } Stack; int isDigit(char c) { return (c >= '0' && c <= '9'); } int toInt(char* str) { int res = 0; for (int i = 0; str[i] != '\0'; i++) { res = res * 10 + (str[i] - '0'); } return res; } int calc(int a, int b, char op) { switch (op) { case '+': return a + b; case '-': return a - b; case '*': return a * b; case '/': return a / b; default: return 0; } } int eval(char* expr) { Stack s; s.top = -1; for (int i = 0; expr[i] != '\0'; i++) { if (isDigit(expr[i])) { // 如果是数字,将其转换成整数并入栈 int num = toInt(&expr[i]); s.data[++s.top] = num; // 将 i 移动到数字串的末尾 while (isDigit(expr[i])) { i++; } i--; } else { // 如果是操作符,弹出栈顶的两个数进行运算,并将结果入栈 int b = s.data[s.top--]; int a = s.data[s.top--]; int res = calc(a, b, expr[i]); s.data[++s.top] = res; } } return s.data[s.top]; } int main() { char expr[MAX_SIZE]; printf("请输入后缀表达式:"); scanf("%s", expr); int res = eval(expr); printf("计算结果为:%d\n", res); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

等日出看彩虹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值