第六周上机实践—项目5—后缀表达式
2015-10-09 08:57
429 查看
/* *Copyright(c) 2015,烟台大学计算机学院 *All rights reserved. *文件名称:test.cpp *作者:林莉 *完成日期:2015年10月09日 *版本:v1.0 * *问题描述:利用sqstack.h中栈的基本运算,实现将一个中缀表达式转换为对应的后缀表达式的算法。 *输入描述:输入一个中缀表达式 *程序输出:后缀表达式的结果 */
1.头文件:sqstack.h,包含定义顺序栈数据结构的代码、宏定义、要实现算法的函数的声明;
#ifndef SQSTACK_H_INCLUDED
#define SQSTACK_H_INCLUDED
#define MaxSize 100
typedef int 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); //输出栈
#endif // SQSTACK_H_INCLUDED
2.源文件:sqstack.cpp,包含实现各种算法的函数的定义
#include <stdio.h> #include <malloc.h> #include <stdlib.h> #include "sqstack.h" 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"); }
3.测试函数:main.cpp,完成相关测试工作
#include <stdio.h> #include <malloc.h> #include <stdlib.h> #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; }
运行结果:
知识点总结:
中缀表达式一般遵循“先乘除,后加减,从左到右计算,先括号内,后括号外”的规则。
后缀表达式已考虑了运算符的优先级,没有括号,只有运算数和运算符。
学习心得:
注意中缀表达式和后缀表达式的运算规则,然后利用相关应用完成转换。
相关文章推荐
- kafka环境搭建
- python实现的各种排序算法代码
- MYSQL数据库关联查询
- 第四周项目2--建立“单链表”算法库
- jQuery Mobile基础04----jQuery Moblie Widgets-checkboxradio(多选框,单选框
- 深入浅出聊Unity3D项目优化:从Draw Calls到GC
- 第六周—项目5 - 后缀表达式
- iOS 数组越界 Crash处理经验
- Android开发常用的一些功能模块
- 亿级Web系统搭建:单机到分布式集群
- 正则表达式
- 第6周 项目1—建立顺序栈算法库
- 链栈
- ocp-250
- ocp-249
- ocp-248
- android 获取设备Configuration配置信息
- Maven介绍,包括作用、核心概念、用法、常用命令、扩展及配置
- java强软弱虚引用详解(转载)
- AngularJS 之iOS 移动 APP 混合开发(原生+JS)