【数据结构与算法】中缀表达式 - 后缀表达式 - 求值
中缀转后缀
#include <stdio.h>
#include <stdlib.h>#define STACK_INIT_SIZE 20
#define STACKINCREMENT 10typedef char ElemType;
typedef struct
{ElemType *base;ElemType *top;int stackSize;
}sqStack;InitStack(sqStack *s)
{s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));if( !s->base )exit(0);s->top = s->base;s->stackSize = STACK_INIT_SIZE;
}Push(sqStack *s, ElemType e)
{// 栈满,追加空间,鱼油必须懂!if( s->top - s->base >= s->stackSize ){s->base = (ElemType *)realloc(s->base, (s->stackSize + STACKINCREMENT) * sizeof(ElemType));if( !s->base )exit(0);s->top = s->base + s->stackSize;s->stackSize = s->stackSize + STACKINCREMENT;}*(s->top) = e; // 存放数据s->top++;
}Pop(sqStack *s, ElemType *e)
{if( s->top == s->base )return;*e = *--(s->top); // 将栈顶元素弹出并修改栈顶指针
}int StackLen(sqStack s)
{return (s.top - s.base);
}int main()
{sqStack s;char c, e;InitStack( &s );printf("请输入中缀表达式,以#作为结束标志:");scanf("%c", &c);while( c != '#' ){while( c>='0' && c<='9' ){printf("%c", c);scanf("%c", &c);if( c<'0' || c>'9' ){printf(" ");}}if( ')' == c ){Pop(&s, &e);while( '(' != e ){printf("%c ", e);Pop(&s, &e);}}else if( '+'==c || '-'==c ){if( !StackLen(s) ){Push(&s, c);}else{do{Pop(&s, &e);if( '(' == e ){Push(&s, e);}else{printf("%c ", e);}}while( StackLen(s) && '('!=e );Push(&s, c);}}else if( '*'==c || '/'==c || '('==c ){Push(&s, c);}else if( '#'== c ){break;}else{printf("\n出错:输入格式错误!\n");return -1;}scanf("%c", &c);}while( StackLen(s) ){Pop(&s, &e);printf("%c ", e);}return 0;
}
后缀求值
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>#define STACK_INIT_SIZE 20
#define STACKINCREMENT 10
#define MAXBUFFER 10typedef double ElemType;
typedef struct
{ElemType *base;ElemType *top;int stackSize;
}sqStack;InitStack(sqStack *s)
{s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));if( !s->base )exit(0);s->top = s->base;s->stackSize = STACK_INIT_SIZE;
}Push(sqStack *s, ElemType e)
{// 栈满,追加空间,鱼油必须懂!if( s->top - s->base >= s->stackSize ){s->base = (ElemType *)realloc(s->base, (s->stackSize + STACKINCREMENT) * sizeof(ElemType));if( !s->base )exit(0);s->top = s->base + s->stackSize;s->stackSize = s->stackSize + STACKINCREMENT;}*(s->top) = e; // 存放数据s->top++;
}Pop(sqStack *s, ElemType *e)
{if( s->top == s->base )return;*e = *--(s->top); // 将栈顶元素弹出并修改栈顶指针
}int StackLen(sqStack s)
{return (s.top - s.base);
}int main()
{sqStack s;char c;double d, e;char str[MAXBUFFER];int i = 0;InitStack( &s );printf("请按逆波兰表达式输入待计算数据,数据与运算符之间用空格隔开,以#作为结束标志: \n");scanf("%c", &c);while( c != '#' ){while( isdigit(c) || c=='.' ) // 用于过滤数字{str[i++] = c;str[i] = '\0';if( i >= 10 ){printf("出错:输入的单个数据过大!\n");return -1;}scanf("%c", &c);if( c == ' ' ){d = atof(str);Push(&s, d);i = 0;break;}}switch( c ){case '+':Pop(&s, &e);Pop(&s, &d);Push(&s, d+e);break;case '-':Pop(&s, &e);Pop(&s, &d);Push(&s, d-e);break;case '*':Pop(&s, &e);Pop(&s, &d);Push(&s, d*e);break;case '/':Pop(&s, &e);Pop(&s, &d);if( e != 0 ){Push(&s, d/e);}else{printf("\n出错:除数为零!\n");return -1;}break;}scanf("%c", &c);}Pop(&s, &d);printf("\n最终的计算结果为:%f\n", d);return 0;
}// 5 - (6 + 7) * 8 + 9 / 4
// 5 - 13 * 8 + 9 / 4
// 5 - 104 + 2.25
// -99 + 2.25
// 5 6 7 + 8 * - 9 4 / +
测试用例
请输入中缀表达式,以#作为结束标志:(52-((28+6)/4+(25/5)6))+249#
52 28 6 + 4 / 25 5 / 6 * + - 24 9 * +
请按逆波兰表达式输入待计算数据,数据与运算符之间用空格隔开,以#作为结束标志:
52 28 6 + 4 / 25 5 / 6 * + - 24 9 * + #
最终的计算结果为:229.500000
【数据结构与算法】中缀表达式 - 后缀表达式 - 求值相关推荐
- 数据结构与算法——中缀转后缀表达式以及计算
中缀表达式转后缀表达式 思路分析: 初始化两个栈:运算符栈s1 和储存中间结果的栈s2 从左至右扫描中缀表达式 遇到操作数,将其压入s2 遇到运算符时,比较其与s1 栈顶运算符的优先级 如果s1 为空 ...
- C++ 中缀转后缀并求值
## 1.中缀转后缀算法思想 遍历字符串:一.若为数字1~9,进入后缀队列:二.若为左括号'(',进入符号栈:三.若为右括号')',将栈顶元素压入后缀队列,直到栈顶为'(':四.若为'+','-',当 ...
- 中缀转后缀并求值(多位数版本)
//中缀转后缀思路: //转换过程需要用到栈,具体过程如下: //1)如果遇到操作数,我们就直接将其输出. //2)如果遇到操作符,则我们将其放入到栈中,遇到左括号时我们也将其放入栈中. //3)如果 ...
- Java数据结构和算法(六)——前缀、中缀、后缀表达式
前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...
- 数据结构与算法——中缀表达式转后缀表达式
目录 什么是后缀表达式 后缀表达式示例图 栈实现后缀表达式 代码实现中缀表达式--后缀表达式 后缀表达式计算器的定义 什么是后缀表达式 也叫逆波兰表达式,将运算符写在操作数之后 中缀形 ...
- 前缀中缀后缀表达式的计算求值
原文在这里 表达式 前缀表达式(波兰表达式) 前缀表达式又称波兰式,前缀表达式的运算符位于操作数之前 举例说明: (3+4)×5-6 对应的前缀表达式就是 - × + 3 4 5 6 前缀表达式求值 ...
- C语言实现中缀转后缀表达式,并求值
C语言实现中缀转后缀表达式,并求值 #include <stdio.h> #include <stdlib.h> #include <ctype.h> #inclu ...
- pnd1 c语言,c语言实现中缀后缀前缀表达式相互转化并求值
<c语言实现中缀后缀前缀表达式相互转化并求值>由会员分享,可在线阅读,更多相关<c语言实现中缀后缀前缀表达式相互转化并求值(21页珍藏版)>请在人人文库网上搜索. 1.1)表达 ...
- 数据结构 - 栈 (逆波兰计算器)(栈的三种表达式)(前缀、中缀和后缀表达式,后缀也叫逆波兰表达式)(中缀表达式转后缀表达式实现步骤及完整代码)
栈的三种表达式:前缀.中缀和后缀表达式,后缀也叫逆波兰表达式 前缀(波兰表达式) 中缀(对人来讲很好理解,对于计算机来讲就方便了,一般会把中缀表达式转换成后缀表达式) 后缀(逆波兰表达式) 计算过程 ...
- 中缀转后缀表达式并计算
注:本博客是基于<数据结构>这门课,主要是为了自己考研,准备专业课 图解转自:中缀转后缀算法 中缀转后缀算法 中缀表达式转后缀表达式遵循以下原则: 遇到操作数,直接输出 当栈为空时,若遇到 ...
最新文章
- 比特币交易追踪溯源技术介绍
- 【Android实战】记录自学自己定义GifView过程,能同一时候支持gif和其它图片!【有用篇】...
- ASP入门(十一)-Session小案例
- 内核中的kmalloc函数详解
- python处理nc文件并输出_利用python如何处理nc数据详解
- gson java 对象_Gson把json串转换成java实体对象
- 计算机算法设计与分析 单峰序列
- android进阶指导
- ssm-学子商城-项目第五天
- z变换判断稳定性和因果性_试题库 - 7:z变换 -
- 硬核!自动驾驶如何做数据标注?特斯拉EP3 Auto Labeling深度分析
- 灵敏度分享码显示服务器不可用,和平精英ss12最稳灵敏度设置方法介绍-2021灵敏度分享码...
- 职场菜鸟如何更好的提升自己?
- 0003建模实例1 椅子能在不平的地面上放平
- 10Wqps评论中台,如何架构?B站是这么做的!!!
- 【免费赠送源码】Springboot剧本杀交流分享平台1p7vg计算机毕业设计-课程设计-期末作业-毕设程序代做
- oracle RAC asm管理
- Windows 查看已保存wifi密码
- 交换机日志删除_如何查看交换机报警日志 并导出日志 命令是什么
- 基于英汉平行语料库的机器翻译知识获取研究