中缀表达式转后缀表达式

「Java 数据结构和算法」:图文详解---中缀表达式转后缀表达式。 栈是⼀个先⼊后出的有序列表。栈(stack)是限制线性表中元素的插⼊和删除只能在线性表的同⼀端进⾏的⼀种特殊线性表。允许插⼊和删除的⼀端,为变化的⼀端,称为栈顶(Top),另⼀端为固定的⼀端,称为栈底(Bottom)。根据栈的定义可知,最先放⼊栈中元素在栈底,最后放⼊的元素在栈顶,⽽删除元素刚好相反,最后放⼊的元素最先删除,最先放⼊的元素最后删除。...... 阅读详情

中缀表达式和后缀表达式的定义,度娘。。。


/*
中缀表达式转换为后缀表达式
步骤如下:
开始扫描中缀表达式;
如果为数字时,加入后缀表达式;
如果为运算符:
a. 若为 '(',入栈;
b. 若为 ')',则依次把栈中的的运算符加入后缀表达式中,直到出现'(',从栈中删除'(' ;
c. 若为 除括号外的其他运算符, 当其优先级高于栈顶运算符时,直接入栈。否则从栈顶开始,
依次弹出比当前处理的运算符优先级高和优先级相等的运算符,直到一个比它优先级低的或者遇到了一个左括号为止。
当扫描的中缀表达式结束时,栈中的的所有运算符出栈。
*/

#include<stdio.h>
#include<string.h> 
#define Stack_Size 50
#define M 50

typedef struct Node
{
	char elem[Stack_Size];
	int top;
}SeqStack;

void InitStack(SeqStack *S)
{
	S->top=-1;
}

int Push(SeqStack *S,char x)
{
	if(S->top==Stack_Size-1)
		return 0;
	S->top++;
	S->elem[S->top]=x;
	return 1;
}

char *Pop(SeqStack *S)
{
	char *x;
	x=(SeqStack *)malloc(sizeof (struct Node));
	if(S->top==-1)
		return 0;
	else
	{
		*x=S->elem[S->top];
		S->top--;
		return *x;
	}
	return 0;
}

char *GetTop(SeqStack *S)
{
	char *x;
	x=(SeqStack *)malloc(sizeof (struct Node));
	if(S->top==-1)
		return -1;
	else 
	{
		*x=S->elem[S->top];
		return *x;
	}
}

int priority(char op)
{
    if(op=='+'||op=='-')
        return 1;
    else if(op=='/'||op=='%')
        return 2;
	else if(op=='*')
		return 3;
    else if(op=='^')
        return 4;
    else
        return 0;
}

int compare(char ch1,char ch2)
{
	if(priority(ch1)>priority(ch2)||priority(ch1)==priority(ch2))
		return 2;
	else return 1;
}

void main()
{
	int i=0,j=0,k=0,m=0;
	char str[M],hou[M],ch='@';
	SeqStack *OPTR;
	InitStack(&OPTR);
	printf("请输入要转换的中缀表达式(以#结束):");
	for(i=0;i<M;i++)
	{
	     scanf("%c",&str[i]);
		 if(str[i]=='#')
			 break;
	}
	while(str[k]!='#')
	{
		if(str[k]>='0'&&str[k]<='9')  //如果是数字或字母时进后缀表达式hou[M]
		{
			hou[m]=str[k];
			m++;
		}
		else if(str[k]>='a'&&str[k]<='z')
		{
			hou[m]=str[k];
			m++;
		}
		else if(str[k]>='A'&&str[k]<='Z')
		{
			hou[m]=str[k];
			m++;
		}
		else if(str[k]=='(')                      //如果是左括号直接进操作符栈OPTR
			Push(&OPTR,str[k]);
		else if(str[k]==')')                      //如果是右括号,将与第一个左括号之间的操作符全部压入后缀表达式中,且左括号出栈
		{
			while(1)
			{
				ch=Pop(&OPTR);
				if(ch=='(')
					break;
				hou[m]=ch;
				m++;
			}
		}
		else if(GetTop(&OPTR)==-1)                //如果是运算符,但是栈顶元素为空时		
			Push(&OPTR,str[k]);
		else if(GetTop(&OPTR)=='(')				  //如果是运算符,但是栈顶元素为'('时
			Push(&OPTR,str[k]);
		else
			    switch(compare(str[k],GetTop(&OPTR)))
		{
			    case 2:Push(&OPTR,str[k]);        //如果优先级比栈顶运算符优先级高  直接入栈
				       break;				     
			    case 1:while(compare(GetTop(&OPTR),str[k])!=1&&GetTop(&OPTR)!='(')
					   {
									hou[m]=Pop(&OPTR);             // 若为不是最高级的运算符,则将从栈顶到第一个优先级不大于它的运算符或 '('之间的运算符加入数栈中,该运算符再入栈; 									
									m++;
					   }
					   if(GetTop(&OPTR)=='(')
						   Pop(&OPTR);
					   Push(&OPTR,str[k]);
					   break;
		}
		k++;
	}
	while(GetTop(&OPTR)!=-1)
	{
		hou[m]=Pop(&OPTR);
		m++;
	}
	printf("将该中缀表达式转换为后缀表达式为:");
	for(i=0;i<m;i++)                                              //输出该后缀表达式
		printf("%c ",hou[i]);
	printf("\n");
}



「Java 数据结构和算法」:图文详解---中缀表达式转后缀表达式。_中缀表达式转后缀表达式流程图 栈是⼀个先⼊后出的有序列表。栈(stack)是限制线性表中元素的插⼊和删除只能在线性表的同⼀端进⾏的⼀种特殊线性表。允许插⼊和删除的⼀端,为变化的⼀端,称为栈顶(Top),另⼀端为固定的⼀端,称为栈底(Bottom)。根据栈的定义可知,最先放⼊栈中元素在栈底,最后放⼊的元素在栈顶,⽽删除元素刚好相反,最后放⼊的元素最先删除,最先放⼊的元素最后删除。 阅读详情

相关推荐

[面试算法]中缀表达式转后缀表达式Python

后缀表达式的特点是:操作数在前面,后面紧跟着操作符。a+b转换成后缀表达式就是ab+。 解决优先级问题。a+bc。\的 优先级比+高,因此在后缀表达式中,*应该比第一个+更先出现。因此,这个中缀表达式将是 abc+ 括号的作用。一对括号内部的是一个合法的表达式,是一个结果,因此可以将一对括号看做一个操作数。中缀表达式转后缀过程中,括号内的表达式,一旦遇到右括号,必须触发计算,不能继续等待。遇到括号,就得将括号内的这一部分表达式转化为后缀表达式。就像(a+b)*c的后缀表达式为ab+c*。 总结以下规则如.

tensory的博客 2029

中缀表达式转后缀表达式详解

深入讲解中缀表达式转后缀表达式的基本原理与实现代码

罅隙的博客 2万+

C++ 中缀表达式转后缀表达式

一、思路:和中缀表达式的计算类似,只不过不用计算,把表达式输出即可       1.用字符数组存储整行输入的中缀表达式;       2.接着从字符数组的0位置开始判断字符,如果是数字,那就要判断后面是否是数字,如果是就不断扫描组成一个整数         (暂不考虑负数和小数),最终组成一个整数,然后输出这个数(因为不用计算,所以直接输出即可);       3.如果是左括号,直接进符号...

ChanJose的博客 1万+

《数据结构》:中缀表达式转后缀表达式 + 后缀表达式的计算

《数据结构》实验报告:中缀/后缀/前缀表达式基本概念 + 前缀转后缀 + 后缀表达式的计算 + 完整算法实现

Amentos的博客 12万+

中缀表达式转后缀表达式的C++实现

中缀表达式转换为后缀表达式的原理是根据运算法则,将包含多种运算符以及括号的中缀表达式,转化为仅包含运算符和操作数,且运算符顺序符合运算符优先级要求的后缀表达式。后缀表达式也称为逆波兰表示法(Reverse Polish Notation, RPN),它的一个主要优点是不需要括号来标识运算顺序。在计算机科学中,栈(Stack)是一种遵从后进先出(LIFO, Last In First Out)原则的抽象数据结构。它仅允许在链表的一端进行插入或删除操作。

weixin_35734408的博客 840

Win10右键新建菜单丢了记事本?别慌!5分钟教你用注册表找回来(附权限设置避坑指南)

本文详细指导如何通过注册表编辑器恢复Win10右键新建菜单中丢失的记事本选项,包括重建键值结构、配置ShellNew项及设置权限等关键步骤。特别提供权限避坑指南,确保修改持久有效,帮助用户快速解决这一常见但困扰的问题。

weixin_31714129的博客 856

中缀表达式转后缀表达式(逆波兰式)

中缀表达式转后缀表达式(逆波兰式)

qq_33300585的博客 6907

AntV G6边动画实战:手把手教你实现数据流向箭头与虚线流动效果

本文详细解析了如何使用AntV G6实现数据流向箭头与虚线流动效果,通过自定义边动画提升数据可视化的动态表现力。从基础环境搭建到核心概念讲解,再到虚线流动动画和箭头路径动画的具体实现与参数调控,帮助开发者掌握G6边动画的高级技巧,适用于网络流量监控、数据传递等场景。

weixin_28487433的博客 266

中缀表达式转后缀表达式的方法,步骤和原理及后缀表达式运算方式

中缀转后缀 本文大部分资料参考慕课何钦铭老师的数据结构 相关的慕课链接:表达式求值 中缀表达式是最常用的算术表达式,运算符在运算数中间,运算需要考虑运算符优先级. 后缀表达式是计算机容易运算的表达式,运算符在运算数后面,从左到右进行运算,无需考虑优先级,运算呈线性结构. 先举个简单的转换例子 2+9/3-5 (前缀)-> 2 9 3 / + 5 - (后缀) 先进行乘除再进行加减 运算规律,...

moge的博客 7万+

Qt6.5.1+WebRTC学习笔记(十二)环境搭建流媒体服务器(ubuntu22.04+SRS)

若只是实现一对一通信,仅使用webrtc就足够了。但有时间需要进行多个人的直播会议,当人比较多时,建议使用一个流媒体服务器,笔者使用的是SRS。这个开源项目资料比较全,笔者仅在此记录下搭建过程。

aggs1990的专栏 3364

变邻域搜索(VNS)原理梳理和应用细节-附求解VRPTW问题C++代码

文章目录1、简介-introduction2、VNS的基本机制2.1 变邻域下降方法-Variable Neighborhood Descent2.2基本变邻域搜索方法-Basic Variable Neighborhood Search2.3 终止准则3、VNS的拓展和混杂算法3.1 VNS的拓展3.2 变邻域分解搜索-Variable Neighborhood Decomposition Search3.3 偏变邻域搜索-Skewed VNS3.4 并行变邻域搜索-Parallel VNS4、VNS和其

dragon Fly的博客 6826

中缀表达式转后缀表达式并计算,C语言实现

作为我们最熟悉的表达式1+1而言,你是否知道其还被称为中缀表达式?提示:以下是本篇文章正文内容,下面案例可供参考以上就是我对于中缀表达式转后缀表达式的理解。!!!!

li209779的博客 5573

告别Root!用Termux+ADB在Android上玩转自动化(保姆级教程)

本文详细介绍了如何在非Root环境下使用Termux和ADB实现Android自动化操作,无需Root权限即可运行自动化脚本。通过Termux搭建Linux终端环境,结合ADB无线调试和Python脚本,实现点击、滑动、截图等自动化功能,适用于定时任务、自动签到等场景。

weixin_42548888的博客 539

中缀表达式转后缀表达式求值

慕课MOOC表达式求值 文章目录慕课MOOC表达式求值前言一、后缀表达式是什么?二、中缀表达式转化成后缀表达式1.中缀表达式转换后缀表达式示例![在这里插入图片描述](https://img-blog.csdnimg.cn/20210501223715258.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xlb3lvbmd5dWFu,size_

leoyongyuan的博客 2646

腾讯云智后台开发实习面试全纪录(已offer)

腾讯云智后台开发实习面经

wenwenaier的博客 5904

智能车图像处理11-进阶篇3--中线累积差值的统计

中线累积差值的统计在后面判断小S,以及长直道的时候都有用到,关键点在于中线的跳变 第12 - 13 行:comulants1 和comlants2代表的是两种不同的累差,取的行数不同 第14-17 行:comulants2取6到25行,其实就是My_Abs(LCenter[i], LCenter[i - 1])的累加 第18-21 行:comulants1去第1到40行 第27- 行: 计算了一下右线的开始于最终结束行,这里判断R_black是否为0,是和中线的提取中g

taiyuezyh的博客 3826

栈实现中缀表达式转后缀表达式

中缀表达式转后缀表达式一、概念1.中缀表达式2.后缀表达式3.前缀表达式二、中缀转后缀1. 分析2.程序模拟三、后缀表达式计算1.分析2. 程序模拟 一、概念 1.中缀表达式 中缀表达式也称为中缀记法,是一个通用的算术或逻辑公式表示方法, 操作符是以中缀形式处于操作数的中间(例:3 + 4),中缀表达式是人们常用的算术表示方法。 2.后缀表达式 后缀表达式也称逆波兰式(Reverse Polish notation,RPN,或逆波兰记法), 是将运算符写在操作数之后。如3+4则为 3 4 + 3.前缀表达式

Mo 1097

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

中缀表达式转后缀表达式、后缀表达式计算得出结果(浮点型也可以计算)(仅正数)

中缀表达式转后缀表达式、后缀表达式计算得出结果(浮点型也可以计算)

m0_60963435的博客 3518

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

中缀表达式转后缀表达式以及表达式的求值

文章目录题目AC代码 题目 本题链接:表达式求值 注:链接题目仅代表和本题大体相似 因为是考研笔试,本题代码以C语言去写 AC代码 代码解释: 代码:

佛系更新 3658
上一篇: 错排详解及应用
下一篇: 搜索的分类及八数码问题
EmanuelBlog
博客等级 码龄15年 19粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值