当前位置: 首页 > article >正文

【数据结构】13:表达式转换(中缀表达式转成后缀表达式)

思想:

从头到尾依次读取中缀表达式里的每个对象,对不同对象按照不同的情况处理。

  1. 如果遇到空格,跳过
  2. 如果遇到运算数字,直接输出
  3. 如果遇到左括号,压栈
  4. 如果遇到右括号,表示括号里的中缀表达式已经扫描完毕,将栈顶的运算符弹出并输出, 直至遇到左括号(左括号出栈但是不输出)
  5. 若遇到运算符,若当前运算符优先级高于栈顶运算符,将其压栈; 若小于等于栈顶元素的优先级,将栈顶运算符弹出并输出,再比较新的栈顶运算符,直到该运算符优先级高于栈顶运算符优先级为止,然后将其压栈。
  6. 若中缀表达式各个对象处理完毕,则把堆栈里的运算符一并输出。

示例

在这里插入图片描述

代码


int precedence(char op) {
	if (op == '+' || op == '-') return 1;
	else if (op == '*' || op == '/') return 2;
	else return 0; // 其他情况,比如括号等
}

char* ExchangeToPost(char* Expr) {

	Stack S;
	S = CreateStack(100);
	int length = strlen(Expr);
	char* result = (char*)malloc(sizeof(char) * (length + 1));
	int i = 0;
	int j = 0;
	int k = 0;
	while (Expr[i] != '\0') {
		if (Expr[i] == ' ') {
			i++;
		}
		else if (isdigit(Expr[i])) {
			result[j] = Expr[i];
			//printf("case digital: result[%d]: %c\n", j, result[j]);
			j++;
			i++;
		}
		else if (Expr[i] == '(') {
			Push(S, Expr[i]);
			i++;
		}
		else if (Expr[i] == ')') {
			//print_s(S);
			char temp = Pop(S);
			while (temp != '(') {
				result[j] = temp;
				//printf("case ')': result[%d]: %c\n", j, result[j]);
				j++;
				temp = Pop(S);
			}
			i++;
		}
		else {
			if (IsEmpty(S)) {
				Push(S, Expr[i]);
				i++;
				continue;
			}
			char temp = Pop(S);
			if (temp == '(') {
				Push(S, temp);
				Push(S, Expr[i]);
				i++;
				continue;
			}
			if (precedence(Expr[i]) > precedence(temp)) {
				
				//printf("case opr: result[%d]: %c\n", j, result[j]);
				Push(S, temp);
				Push(S, Expr[i]);
				i++;
			}
			else {
				while (precedence(Expr[i]) <= precedence(temp))
				{
					result[j] = temp;
					//printf("case opr: result[%d]: %c\n", j, result[j]);
					j++;
					temp = Pop(S);
					
				}
				
				Push(S, temp);
				Push(S, Expr[i]);
				i++;
			}

		}
		//printf("i: %d, j: %d\n", i, j);
		//print_s(S);

	}


	while (!IsEmpty(S)) {
		result[j] = Pop(S);
		j++;

	}
	result[j] = '\0';
	return result;
}

http://www.kler.cn/a/234622.html

相关文章:

  • 电脑缺失libcurl.dll怎么解决?详解电脑libcurl.dll文件丢失问题
  • Java 8使用Stream流去除一个list中包含另一个list已存在的某个字段的对象
  • Windows配置IE浏览器不自动跳转到Edge
  • C#使用Tesseract C++ API过程记录
  • 使用 HTML5 Canvas 实现动态蜈蚣动画
  • Vue3 Suspense:处理异步渲染过程
  • 【Java】悲观锁和乐观锁有什么区别?
  • 【java】笔记10:类与对象——本章练习
  • Leetcode 3033. Modify the Matrix
  • Spring + Tomcat项目中nacos配置中文乱码问题解决
  • 代码随想录算法训练营第39天(动态规划02● 62.不同路径 ● 63. 不同路径 II
  • 第二节 zookeeper基础应用与实战
  • 知识价值2-什么是IDE?新手用哪个IDE比较好?
  • python:lxml 读目录.txt文件,用 xmltodict 转换为json数据,生成jstree所需的文件
  • 寒假作业5
  • 基于python和matlab的复杂函数拟合的方法、工具以及学习资料
  • 【中间件学习】什么是中间件
  • 【Linux进程间通信】用管道实现简单的进程池、命名管道
  • [AIGC] Tomcat:一个简单 and 高效的 Java Web 服务器
  • 【设计模式】23中设计模式笔记
  • Hadoop:认识MapReduce
  • 【数据结构和算法】--- 基于c语言排序算法的实现(2)
  • Rust变量与常量介绍
  • vue-生命周期+工程化开发(三)
  • RCS系统之:机器人状态
  • 快速搭建 nfs 环境, 解决 nfs 搭建时的疑难杂症