第六周项目四 后缀表达式
来源:互联网 发布:centos jdk rpm 编辑:程序博客网 时间:2024/04/30 10:48
/* *Copyright (c) 2015,烟台大学计算机学院 *All rights reserved. *文件名称:houzhuibiaodashi.cpp *作者:朱希康 *完成日期:2015年10月20日 *版本号:vc++6.0 * *问题描述:后缀表达式 *输入描述:一个算数表达式 *程序输出:加后缀的表达式*/
#ifndef SQSTACK_H_INCLUDED#define SQSTACK_H_INCLUDED#include<stdio.h>#define MaxSize 100typedef char ElemType;typedef struct{ ElemType data[MaxSize]; int top; //栈指针} SqStack; //顺序栈类型定义void InitStack(SqStack *&s); //初始化栈void DestroyStack(SqStack *&s); //销毁栈bool StackEmpty(SqStack *s); //栈是否为空int StackLength(SqStack *s); //返回栈中元素个数——栈长度bool Push(SqStack *&s,ElemType e); //入栈bool Pop(SqStack *&s,ElemType &e); //出栈bool GetTop(SqStack *s,ElemType &e); //取栈顶数据元素void DispStack(SqStack *s); //输出栈bool isMatch(char *st);int leftpri(char op); //求左运算符op的优先级int rightpri(char op); //求右运算符op的优先级bool InOp(char ch); //判断ch是否为运算符int Precede(char op1,char op2); //op1和op2运算符优先级的比较结果void trans(char *exp,char postexp[]);//将算术表达式exp转换成后缀表达式postexp#endif // SQSTACK_H_INCLUDED
#include "head.h"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;}
#include <stdio.h>#include <stdlib.h>#include "head.h"#define MaxOp 7struct //设定运算符优先级{ char ch; //运算符 int pri; //优先级}lpri[]= {{'=',0},{'(',1},{'*',5},{'/',5},{'+',3},{'-',3},{')',6}},rpri[]= {{'=',0},{'(',6},{'*',4},{'/',4},{'+',2},{'-',2},{')',1}};//初始化栈void InitStack(SqStack *&s){ s=(SqStack *)malloc(sizeof(SqStack));s->top=-1;}//销毁栈void DestroyStack(SqStack *&s){free(s);}//返回栈长度int StackLength(SqStack *s){ return(s->top+1);}//判断栈是否为空bool StackEmpty(SqStack *s){return(s->top==-1);}//进栈bool Push(SqStack *&s,ElemType e){if(s->top==MaxSize-1) return false; s->top++; s->data[s->top]=e; return true; }//出栈bool Pop(SqStack *&s,ElemType &e){ if(s->top==-1) return false; e=s->data[s->top]; s->top--; return true;}//取栈顶元素bool GetTop(SqStack *s,ElemType &e){ if(s->top==-1) return false; e=s->data[s->top]; return true;}//输出栈中元素void DispStack(SqStack *s) //输出栈{ int i; for (i=s->top;i>=0;i--) printf("%c ",s->data[i]); printf("\n");}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);}
运算结果:
知识点总结:
依据栈的思路,将数字入栈,判断不为数字时,在栈中加入#。
0 0
- 第六周项目四 后缀表达式
- 第六周项目(5):后缀表达式
- 第六周--项目五--后缀表达式
- 第六周项目五~~~后缀表达式
- 第六周—项目5 - 后缀表达式
- 第六周--项目5后缀表达式
- 第六周项目5-后缀表达式
- 第六周 项目5-后缀表达式
- 第六周 项目5 后缀表达式
- 第六周 项目5-后缀表达式
- 第六周项目5-后缀表达式
- 第六周项目5--后缀表达式
- 第六周项目五-后缀表达式
- 第六周项目5--后缀表达式
- 第六周项目5—后缀表达式
- 第六周项目5-后缀表达式
- 第六周项目5--后缀表达式
- 第六周项目5-后缀表达式
- hdu2639bone collector II【第K优解】
- IOS笔记UI--QQ好友动态LTNavigationBarDemo
- 搜集下面试题目吧---长期更新
- Emmet使用
- 判断一个程序员水平高低的标准?
- 第六周项目四 后缀表达式
- java的多线程
- 7,8天
- 【JQuery】动态加载的图片如何实现LazyLoad
- Javascript模块化编程
- poj 1200 hash
- java switch支持的数据类型
- 如何拓展OpenStack nova
- 如何反编译Android的Apk文件获取其代码和资源文件