中缀转后缀

#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

【数据结构与算法】中缀表达式 - 后缀表达式 - 求值相关推荐

  1. 数据结构与算法——中缀转后缀表达式以及计算

    中缀表达式转后缀表达式 思路分析: 初始化两个栈:运算符栈s1 和储存中间结果的栈s2 从左至右扫描中缀表达式 遇到操作数,将其压入s2 遇到运算符时,比较其与s1 栈顶运算符的优先级 如果s1 为空 ...

  2. C++ 中缀转后缀并求值

    ## 1.中缀转后缀算法思想 遍历字符串:一.若为数字1~9,进入后缀队列:二.若为左括号'(',进入符号栈:三.若为右括号')',将栈顶元素压入后缀队列,直到栈顶为'(':四.若为'+','-',当 ...

  3. 中缀转后缀并求值(多位数版本)

    //中缀转后缀思路: //转换过程需要用到栈,具体过程如下: //1)如果遇到操作数,我们就直接将其输出. //2)如果遇到操作符,则我们将其放入到栈中,遇到左括号时我们也将其放入栈中. //3)如果 ...

  4. Java数据结构和算法(六)——前缀、中缀、后缀表达式

    前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...

  5. 数据结构与算法——中缀表达式转后缀表达式

    目录 什么是后缀表达式 后缀表达式示例图 栈实现后缀表达式 代码实现中缀表达式--后缀表达式 后缀表达式计算器的定义 ​​​​​​​ 什么是后缀表达式 也叫逆波兰表达式,将运算符写在操作数之后 中缀形 ...

  6. 前缀中缀后缀表达式的计算求值

    原文在这里 表达式 前缀表达式(波兰表达式) 前缀表达式又称波兰式,前缀表达式的运算符位于操作数之前 举例说明: (3+4)×5-6 对应的前缀表达式就是 - × + 3 4 5 6 前缀表达式求值 ...

  7. C语言实现中缀转后缀表达式,并求值

    C语言实现中缀转后缀表达式,并求值 #include <stdio.h> #include <stdlib.h> #include <ctype.h> #inclu ...

  8. pnd1 c语言,c语言实现中缀后缀前缀表达式相互转化并求值

    <c语言实现中缀后缀前缀表达式相互转化并求值>由会员分享,可在线阅读,更多相关<c语言实现中缀后缀前缀表达式相互转化并求值(21页珍藏版)>请在人人文库网上搜索. 1.1)表达 ...

  9. 数据结构 - 栈 (逆波兰计算器)(栈的三种表达式)(前缀、中缀和后缀表达式,后缀也叫逆波兰表达式)(中缀表达式转后缀表达式实现步骤及完整代码)

    栈的三种表达式:前缀.中缀和后缀表达式,后缀也叫逆波兰表达式 前缀(波兰表达式) 中缀(对人来讲很好理解,对于计算机来讲就方便了,一般会把中缀表达式转换成后缀表达式) 后缀(逆波兰表达式) 计算过程 ...

  10. 中缀转后缀表达式并计算

    注:本博客是基于<数据结构>这门课,主要是为了自己考研,准备专业课 图解转自:中缀转后缀算法 中缀转后缀算法 中缀表达式转后缀表达式遵循以下原则: 遇到操作数,直接输出 当栈为空时,若遇到 ...

最新文章

  1. 比特币交易追踪溯源技术介绍
  2. 【Android实战】记录自学自己定义GifView过程,能同一时候支持gif和其它图片!【有用篇】...
  3. ASP入门(十一)-Session小案例
  4. 内核中的kmalloc函数详解
  5. python处理nc文件并输出_利用python如何处理nc数据详解
  6. gson java 对象_Gson把json串转换成java实体对象
  7. 计算机算法设计与分析 单峰序列
  8. android进阶指导
  9. ssm-学子商城-项目第五天
  10. z变换判断稳定性和因果性_试题库 - 7:z变换 -
  11. 硬核!自动驾驶如何做数据标注?特斯拉EP3 Auto Labeling深度分析
  12. 灵敏度分享码显示服务器不可用,和平精英ss12最稳灵敏度设置方法介绍-2021灵敏度分享码...
  13. 职场菜鸟如何更好的提升自己?
  14. 0003建模实例1 椅子能在不平的地面上放平
  15. 10Wqps评论中台,如何架构?B站是这么做的!!!
  16. 【免费赠送源码】Springboot剧本杀交流分享平台1p7vg计算机毕业设计-课程设计-期末作业-毕设程序代做
  17. oracle RAC asm管理
  18. Windows 查看已保存wifi密码
  19. 交换机日志删除_如何查看交换机报警日志 并导出日志 命令是什么
  20. 基于英汉平行语料库的机器翻译知识获取研究

热门文章

  1. java oss 批量传输_阿里云OSS对象存储,服务端签名后直传阿里云OSS
  2. 机器学习-机器学习概论(入门机器学习基础知识)
  3. windows 2008 域 删除不活动计算机账号,如何删除域内非活动计算机账号?
  4. [bzoj2159]Crash 的文明世界
  5. 15.枚举enum.rs
  6. Win32多线程编程(2) — 线程控制
  7. 第04讲: 基础探究,Session 与 Cookies
  8. 为什么编程语言初创公司那么少?
  9. OS- -操作系统常见问题总结
  10. 指定父对象和信号与槽