ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

数据结构学习之栈的应用:中缀转后缀表达式

2022-04-23 16:34:21  阅读:144  来源: 互联网

标签:中缀 int void 之栈 char str 数据结构 top


数据结构栈的应用:中缀转后缀表达

利用栈的先入后出思想:

中缀转后缀表达 思路:对这种数据进行处理时需对表达式进行加上括号
1.仍然从左至右来处理数据    
2.当遇到左括号时,忽略它
3.当遇到数值时,直接输出
4.当遇到操作符时,将操作符入栈
5.当遇到右括号时,出栈顶的操作符
   例1.(1+4)*(5+8)
  14+58+*
 
   例2. 1+4*5*8
        14+5*8* 这种转换即为错误的

 

//数据结构之栈的应用:中缀转后缀 C实现:

//数据结构之栈的应用:中缀转后缀
//@输入:((1+8)*(8*2)*8)
//@输出:18+82*8*
//@输入:((1+8)*(8+2))
//@输出:18+82+*
//注 本函数需要严格按照给定格式输入 最外层要添加括号 不然会输出错误
#include<stdio.h>
#include<string.h>

int stack[512]; //存放栈的数据
int top = 0; //指向栈顶的指针

void push(char c); //入栈操作
int pop(void); //出栈操作
int is_empty(void); //检测栈是否为空
void postfix(void); //将中缀转为后缀实现函数

int main(void) {
postfix();
return 0;
}

//入栈操作
void push(char c) {
stack[top++] = c;
}

//出栈操作
int pop(void) {
return stack[--top];
}

//检测栈是否为空
int is_empty(void) {
return top == 0;
}

//将中缀转为后缀实现函数
/*
中缀转后缀表达 思路:对这种数据进行处理时需对表达式进行加上括号
1.仍然从左至右来处理数据
2.当遇到左括号时,忽略它
3.当遇到数值时,直接输出
4.当遇到操作符时,将操作符入栈
5.当遇到右括号时,出栈顶的操作符
*/
void postfix(void) {
char str[100]; //存储输入的表达式
int  len;

printf("请输入表达式:\n");
gets(str);

len = strlen(str);

for (int i = 0; i < len; i++) { //1.从左到右处理数据
if (str[i] == '(') //2.遇到左括号时,忽略它
continue; //直接将这个语句跳过
else if (str[i] >= '0' && str[i] <=  '9' ) //3.遇到数值时,直接输出
printf("%c", str[i]);
else if ((str[i] == '+') || (str[i] == '-') || (str[i] == '*')) //逻辑与有一个为真即为真
push(str[i]); //4.当遇到操作符时将操作符入栈
else if (str[i] == ')') //5.当遇到右括号时,出栈顶的操作符
printf("%c", pop());
}
}

无注释版本:

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

char stack[512];
int top = 0;

void push(char c);
char pop(void);
int is_empty(void);

int main(void) {
char str[100];
int i, len;

printf("Please enter a calcuate expression:");
gets(str);

len = strlen(str);

for (i = 0; i < len; i++) {
if (str[i] == '(')
continue;
else if ((str[i] >= '0') && (str[i] <= '9'))
printf("%c", str[i]);
else if ((str[i] == '+') || (str[i] == '-') || (str[i] == '*'))
push(str[i]);
else if (str[i] == ')')
printf("%c", pop());
}
printf("\n");

return 0;
}

void push(char c) {
stack[top++] = c;
}

char pop(void) {
return stack[--top];
}

int is_empty(void) {
return top == 0;
}
 

标签:中缀,int,void,之栈,char,str,数据结构,top
来源: https://www.cnblogs.com/Studycj/p/16182729.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有