第六周项目5—后缀表达式
2015-10-16 08:44
211 查看
问题:
/*
Copyright (c)2015,烟台大学计算机与控制工程学院
All rights reserved.
文件名称:项目5.cbp
作 者:李艺
完成日期:2015年10月16日
版 本 号:v1.0
问题描述:利用sqstack.h中栈的基本运算,实现将一个中缀表达式转换为对应的后缀表达
式的算法。例如,输入(56-20)/(4+2),输出后缀表达式::56#20#-4#2#+/要求
在数字后加#
输入描述:前缀表达式
程序输出:中缀表达式 后缀表达式
*/
头文件及功能函数详见点击打开链接
main函数代码:
运行结果:
知识点总结:
通过栈解决具体应用问题。
/*
Copyright (c)2015,烟台大学计算机与控制工程学院
All rights reserved.
文件名称:项目5.cbp
作 者:李艺
完成日期:2015年10月16日
版 本 号:v1.0
问题描述:利用sqstack.h中栈的基本运算,实现将一个中缀表达式转换为对应的后缀表达
式的算法。例如,输入(56-20)/(4+2),输出后缀表达式::56#20#-4#2#+/要求
在数字后加#
输入描述:前缀表达式
程序输出:中缀表达式 后缀表达式
*/
头文件及功能函数详见点击打开链接
main函数代码:
#include "sqstack.h" #define MaxOp 7 struct //设定运算符优先级 { char ch; //运算符 int pri; //优先级 } lpri[]= {{'=',0},{'(',1},{'*',5},{'/',5},{'+',3},{'-',3},{')',6}}, rpri[]= {{'=',0},{'(',6},{'*',4},{'/',4},{'+',2},{'-',2},{')',1}}; int leftpri(char op) //求左运算符op的优先级 { int i; for (i=0; i<MaxOp; i++) if (lpri[i].ch==op) return lpri[i].pri; } int rightpri(char op) //求右运算符op的优先级 { int i; for (i=0; i<MaxOp; i++) if (rpri[i].ch==op) return rpri[i].pri; } bool InOp(char ch) //判断ch是否为运算符 { if (ch=='(' || ch==')' || ch=='+' || ch=='-' || ch=='*' || ch=='/') return true; else return false; } int Precede(char op1,char op2) //op1和op2运算符优先级的比较结果 { if (leftpri(op1)==rightpri(op2)) return 0; else if (leftpri(op1)<rightpri(op2)) return -1; else return 1; } void trans(char *exp,char postexp[]) //将算术表达式exp转换成后缀表达式postexp { SqStack *opstack; //定义运算符栈 int i=0; //i作为postexp的下标 ElemType ch; InitStack(opstack); //用初始化栈运算为栈分配空间,务必要做 Push(opstack, '='); while (*exp!='\0') //exp表达式未扫描完时循环 { if (!InOp(*exp)) //为数字字符的情况 { while (*exp>='0' && *exp<='9') //判定为数字 { postexp[i++]=*exp; exp++; } postexp[i++]='#'; //用#标识一个数值串结束 } else //为运算符的情况 { GetTop(opstack, ch); //取得栈顶的运算符 switch(Precede(ch ,*exp)) { case -1: //栈顶运算符的优先级低:进栈 Push(opstack, *exp); exp++; //继续扫描其他字符 break; case 0: //只有括号满足这种情况 Pop(opstack, ch); //将(退栈 exp++; //继续扫描其他字符 break; case 1: //退栈并输出到postexp中 postexp[i++]=ch; Pop(opstack, ch); break; } } } //while (*exp!='\0') Pop(opstack, ch); while (ch!='=') //此时exp扫描完毕,退栈到'='为止 { postexp[i++]=ch; Pop(opstack, ch); } postexp[i]='\0'; //给postexp表达式添加结束标识 DestroyStack(opstack); } int main() { char exp[]="(56-20)/(4+2)"; //可将exp改为键盘输入 char postexp[200]; trans(exp,postexp); printf("中缀表达式:%s\n",exp); printf("后缀表达式:%s\n",postexp); return 0; }
运行结果:
知识点总结:
通过栈解决具体应用问题。
相关文章推荐
- 数组转化成批查询条件
- // 把UTF-8转换成Unicode
- Delphi6 提示 Class TMSComm not found
- 第7周、项目2—建立链队算法库
- 第四周项目 猴子选大王
- [Leetcode] Word Ladder
- spring3.0自带的定时任务重复执行两次
- 第三周项目4—顺序表的应用(2)
- servlet容器和web容器
- 第4周项目6 多项式求和
- 在linux中出现there are stopped jobs 的解决方法(转)
- cookies编程
- 顺序表的应用
- iOS讲解迷惑之键盘弹出遮挡输入框的问题
- 第八周 串 项目2 -- 建立链串的算法库
- 第四周 项目3 单链表的应用
- python脚本前两行
- 转载: Nova-Router 分析
- Linux下TCP客户端和服务器代码编写
- 第六周项目3—括号的匹配