中缀表达式转后缀表达式栈的变化_利用栈实现中缀转后缀

中缀表达式转后缀表达式栈的变化_利用栈实现中缀转后缀这里给出中缀表达式转后缀表达式的算法过程,以及再举两个例子算法过程:1.数字直接加入后缀表达式2.如果是‘(’,入栈3.如果是‘)’,则依次把栈中的运算符加入后缀表达式,直到出现‘(’并从栈中删除它4.如果是运算符+-*/a.栈空或者栈顶元素为‘(’,入栈b.高于栈顶元素优先级,入栈c.否则依次弹出栈顶运算符,直到遇到一个优先级小于它的运算符或者是遇到‘(’为止5.遍历完成后,如果栈非空则依次弹出所有栈顶元素加入到表达式当中例1:…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

这里给出中缀表达式转后缀表达式的算法过程,以及再举两个例子

算法过程:

1. 数字直接加入后缀表达式
2.如果是‘(’, 入栈
3.如果是‘)’, 则依次把栈中的运算符加入后缀表达式,直到出现‘(’并从栈中删除它
4. 如果是运算符 + – * /
    a.栈空或者栈顶元素为‘(’, 入栈
    b.高于栈顶元素优先级,入栈
    c.否则依次弹出栈顶运算符,直到遇到一个优先级小于它的运算符或者是遇到‘(’为止
5.遍历完成后,如果栈非空则依次弹出所有栈顶元素加入到表达式当中

例1:

中缀表达式转后缀表达式栈的变化_利用栈实现中缀转后缀

 

例2:

中缀表达式转后缀表达式栈的变化_利用栈实现中缀转后缀

code:

#include <stdio.h> 
#include <string.h> 

#define MaxSize 100 

typedef struct{
	char data[MaxSize];
	int top; // 栈顶指针 指向栈顶元素 
} SeqStack;

// 顺序栈初始化 
void StackInit(SeqStack s)
{
	s.top = 0;
	memset(s.data, 0, sizeof(s.data));
}
// 入栈 
bool StackPush(SeqStack &s, char e)
{
	if(s.top == MaxSize){
		return false;
	}
	s.data[s.top++] = e;
	return true;
}
// 出栈 
bool StackPop(SeqStack &s)
{
	if(s.top == 0){
		return false;
	}
	s.data[s.top-1] = '\0';
	s.top--;
	return false;
}
// 获取栈顶元素 
char GetTop(SeqStack s)
{
	return s.data[s.top-1];
}
// 判断栈是否为空 
bool StackIsEmpty(SeqStack s)
{
	return (s.top == 0 ? true : false);
}
// 优先级比较 
bool check(char ch1, char ch2) // 只有ch1的优先级小于ch2的优先级时返回true 
{
	if((ch1 == '+' || ch1 == '-') && (ch2 == '*' || ch2 == '/')){
		return true;
	}
	return false;
}
// 三个参数分别时 栈,目标表达式,转换后的结果 
void solve(SeqStack &s, char *str, char *ans)
{
	int idx = 0; // ans的下标 
	int len = strlen(str);
	for(int i = 0; i < len; i++){
		if(str[i] >= '0' && str[i] <= '9'){ // 数字加入表达式 
			ans[idx] = str[i];
			idx++;
		}
		else if(str[i] == '(' || StackIsEmpty(s) || GetTop(s) == '('){ // 栈为空或栈顶为左括号 入栈 
			StackPush(s, str[i]);
		}
		else if(str[i] == ')'){ // 如果为右括号 
			do{
				ans[idx] = GetTop(s);
				idx++; 
				StackPop(s);
			}while(GetTop(s) != '(' );
			StackPop(s); // 删除左括号 
		}
		// 当前元素是运算符 如果优先级高于栈顶元素 入栈 
		else if(check(GetTop(s),str[i])){
			StackPush(s, str[i]);
		}
		else{ // 其他情况->当前元素是运算符且不能入栈 
			do{
				ans[idx] = GetTop(s);
				idx++;
				StackPop(s);
			}while(!(check(GetTop(s), str[i]) || GetTop(s) == '(') ); 
			StackPush(s, str[i]);
		}
	}
	while(!StackIsEmpty(s)){ // 栈内有剩余运算符则加入表达式 
		ans[idx++] = GetTop(s);
		StackPop(s);
	}
	ans[idx] = '\0'; // 确保ans为字符串不会有多余内容 
}

int main()
{
	SeqStack s;
	StackInit(s);
	char str[MaxSize], ans[MaxSize] = {0};
	scanf("%s", str);
	solve(s, str, ans);
	printf("%s\n", ans);
	
	return 0;
}

Jetbrains全家桶1年46,售后保障稳定

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/226774.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SpringBoot事务注解@Transactional

    SpringBoot事务注解@TransactionalSpringBoot提供了非常方便的事务操作,通过注解就可以实现事务的回滚,非常方便快捷,下面我们就说一下如何进行事务操作。1.事务说明在Spring中,事务有两种实现方式,分别是编程式事务管理和声明式事务管理两种方式。编程式事务管理:编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。

    2022年4月27日
    110
  • mini pcie有什么用_ipad mini适合做笔记吗

    mini pcie有什么用_ipad mini适合做笔记吗网上的相关资料链接:https://baijiahao.baidu.com/s?id=1598588903382575978&wfr=spider&for=pc(关于MiniPCIe二三事)minipcie的接口外观与mSATA接口外观一致,一样可以插入设备,但一般是不能通用,两者插槽上的阵脚信号定义不同,都是54Pin。mSATA接口是用来连接迷你版本的SATA…

    2025年10月8日
    3
  • a标签如何打开新窗口_a标签怎么跳转页面

    a标签如何打开新窗口_a标签怎么跳转页面a标签打开新窗口只需要在a标签后面加target=”_blank”<ahref=”index.html”target=”_blank”>跳转到新窗口打开</a>扩展:a标签后面加target=”_self”是此窗口默认打开(这个属性是默认的)<ahref=”index.html”target=”_self”>此窗口打开</a>…

    2025年7月16日
    3
  • 关于安装busybox问题

    关于安装busybox问题我的手机是小米5安装busybox1.首先要手机要root2.然后下载busybox安装器(这个容易找)3.解锁system分区(可以下载syslock,这软件可以解锁system文件)点击下载syslock如果不下载system,会安装失败;4.解锁重启后就可以安装了…

    2022年7月25日
    13
  • 冒泡排序法c语言代码_用冒泡法对数组a进行排序

    冒泡排序法c语言代码_用冒泡法对数组a进行排序选择法排序选择法排序是指:如果要把一个数组从小到大排列,那么就从该数组中依次选择最小的数字来排序。从第一个数字开始,将第一个数字与数组中剩下数字中最小的那一个交换位置,然后将第二个数字与剩下数字中最小的那个交换位置,以此类推,直到最后一个数字。例如输入数组{7,5,4,8,6,2,3}第一次排序通过查找最小的数字,交换7与2的位置;第二次查找5后面最小的数字,找到了3,交换5与3的位置;第三次查找4之后最小的数字,发现并没有数字比4小,交换4与4的位置(相当于没有改变);第四次查找8后面最小的数字5,

    2025年11月11日
    2
  • SIFT–尺度空间、高斯金字塔

    SIFT–尺度空间、高斯金字塔尺度空间高斯金字塔高斯模糊下采样高斯金字塔的构造过程差分高斯金字塔构造过程SIFT成名已久,但理解起来还是很难的,一在原作者Lowe的论文对细节提到的非常少,二在虽然网上有许多相应博文,但这些博文云里雾里,非常头疼,在查看了许多资料了,下面贴出我自己的一些理解,希望有所帮助。Lowe把SIFT分为四个阶段:构建尺度空间、关键点的定位、方向分配、特征描述符。下面分别从这四个阶段来阐述。尺度空

    2022年10月14日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号