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

中缀表达式转后缀表达式栈的变化_利用栈实现中缀转后缀这里给出中缀表达式转后缀表达式的算法过程,以及再举两个例子算法过程: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] = '
#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;
}
'; 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] = '
#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;
}
'; // 确保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,售后保障稳定

 

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • java文件上传总结[通俗易懂]

    java文件上传总结[通俗易懂]前言文件上传是各类应用中经常碰到的需求,不管是上传图片、文件、音频、视频等,或者其他类型的文件,都是后端需要解决的,采用什么样的方式进行上传,或者对上传后的文件如何进行存储,甚至如何更加高效的上传文件等问题,都是在实际开发中需要解决的,本文将对常用的文件上传使用进行一下简单的小结以springboot为例,下面我们就开始撸码吧,开工前我们还是做一下简单的准备吧,本文的演示demo框架为springboot2.2.1版本,只需简单引入一个下面的依赖即可,其他需要用到的,我们增量添加即可 <de

  • PotPlayer快捷键查询[通俗易懂]

    PotPlayer快捷键查询[通俗易懂]快捷键指令————————–常用—————————C播放->播放速度->加速+Z播放->播放速度->正常/之前的速度X播放->播放速度->减速-`…

  • Java对象锁和类锁全面解析(多线程synchronized关键字)

    Java对象锁和类锁全面解析(多线程synchronized关键字)

    2020年11月12日
  • 光纤及光纤接入设备[通俗易懂]

    光纤及光纤接入设备[通俗易懂]全面了解光纤接入设备及使用图解由于不同种类信息的需求也越来越多,伴随而来的不断增长的IP数据、话音、多媒体图像等多种新业务需求,促使了各大网络运营商的传送网络环境发生了翻天俯地的变化,以前那些以承载模拟话音为主要目的的传统城域网和接入网在容量以及接口种类上都已经无法满足多种多样的新业务传输与处理的要求。于是迫于社会信息量的突飞猛进,那些专门为城域网和接入…

  • JDK卸载删除

    JDK卸载删除Java卸载1.进入环境变量,点击Java_Home2.进入路径,删除JDK清理环境变量删除path下关于Java的环境变量查看是否清除cdm运行输入java-version

  • 小米手机1亿像素跟相机(2020相机新品)

    小米集团旗下品牌Redmi再度发布多款“性价比之王”手机新品。11月26日,小米发布RedmiNote9系列的Note9Pro、Note95G和Note94G三款手机新品,三款手机价格均位于“千元档”甚至低于千元,再度成为市场上同价位机型中的“性价比之王”。对此,小米集团副总裁、中国区总裁、Redmi品牌总经理卢伟冰重申,“Redmi的想法很简单,就是为用户做好产品,然后价格卖的尽量厚道,坚持高端产品大众化,大众产品品质化。”此次小米推出的Note9Pro沿袭了之前的Note8Pro在超清

发表回复

您的电子邮箱地址不会被公开。

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