第六周 数据结构实践——后缀式表达
来源:互联网 发布:广州java培训哪家好 编辑:程序博客网 时间:2024/05/17 07:22
/*
* Copyright (c) 2015, 烟台大学计算机与控制工程学院
* All rights reserved.
* 文件名称: sqstack.cpp,main.cpp,sqstack.h
* 作 者:于东林
* 完成日期:2015年10月26日
* 版本号:codeblocks
* 问题描述:实现将一个中缀表达式转换为对应的后缀表达式的算法。例如,输入(56-20)/(4+2),输出后缀表达式::56#20#-4#2#+/要求在数字后加#。
* 输入描述:无
* 程序输出::56#20#-4#2#+/
*/
程序及代码:
#ifndef SQSTACK_H_INCLUDED#define SQSTACK_H_INCLUDED#include <stdio.h>#include <malloc.h>#define MaxSize 100#define MaxOp 7typedef char ElemType;typedef struct{ ElemType data[MaxSize]; int top; //栈指针} SqStack; //顺序栈类型定义struct //设定运算符优先级{ char ch; //运算符 int pri; //优先级}lpri[]= {{'=',0},{'(',1},{'*',5},{'/',5},{'+',3},{'-',3},{')',6}},rpri[]= {{'=',0},{'(',6},{'*',4},{'/',4},{'+',2},{'-',2},{')',1}};void trans(char *exp,char postexp[]);int leftpri(char op);bool GetTop(SqStack *s,ElemType &e);void DestroyStack(SqStack *&s);void InitStack(SqStack *&s); //初始化栈bool StackEmpty(SqStack *s); //栈是否为空bool Push(SqStack *&s,ElemType e); //入栈bool Pop(SqStack *&s,ElemType &e); //出栈void MultiBaseOutput (int number,int base);#endif // SQSTACK_H_INCLUDED
#include "list.h"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;}void DestroyStack(SqStack *&s){ free(s);}void InitStack(SqStack *&s){ s=(SqStack *)malloc(sizeof(SqStack)); s->top=-1;}bool GetTop(SqStack *s,ElemType &e){ if (s->top==-1) //栈为空的情况,即栈下溢出 return false; e=s->data[s->top]; return true;}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 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);}
#include "list.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;}
运行结果:
知识点总结:
这是根据符号的优先级决定的。
学习心得:
似懂非懂,感觉的有点难。
0 0
- 第六周 数据结构实践——后缀式表达
- 第六周数据结构实践——后缀表达式(栈)【项目5 - 后缀表达式】
- 第六周项目五 数据结构实践——后缀表达式(栈)
- 第六周上机实践—项目5—后缀表达式
- 第六周上机实践项目5——后缀表达式
- 第六周实践项目5—后缀表达方式
- 第六周实践项目5—后缀表达式
- 数据结构实践——后缀表达式(栈)
- 数据结构实践——后缀表达式
- 第六周实践项目~后缀表达式
- 数据结构学习笔记2——用栈计算后缀(postfix)表达的完整代码
- 第六周—项目5 - 后缀表达式
- 第六周项目5—后缀表达式
- 第六周项目5—后缀表达式
- 第六周项目5—后缀表达式
- 第六周项目三 数据结构实践——括号的匹配(栈)
- 第六周项目四数据结构实践——数制转换(栈)
- 第六周 数据结构实践项目——栈【项目1 - 建立顺序栈算法库】
- 十个数求最大
- 最后一个单词的长度(LintCode)
- linux安装nginx
- 当你输入一个网址的时候,实际会发生什么?
- Logstash学习3_通过Kafka传输数据给logstash-1.4和logstash-1.5
- 第六周 数据结构实践——后缀式表达
- 第九周项目三~~~稀疏矩阵相加
- 第八周项目1—建立顺序串的算法库
- C#扩展方法集合类
- Git:step by step 1
- struts2中如何设置四大域对象
- CentOS epel yum 源配置
- Spring知识点总结大全
- 项目4-广义表算法库及应用