第六周 后缀表达式

来源:互联网 发布:java spring mvc 框架 编辑:程序博客网 时间:2024/06/05 17:04
 
<pre class="cpp" name="code">/*Copyright (c++)2015,烟台大学计算机与控制工程学院All rights reserved.文件名称:第六周 项目后缀表达式作    者:纪冬雪完成日期:2015年10月14日版 本 号:v1.0问题描述:利用sqstack.h中栈的基本运算,实现将一个中缀表达式转换为对应的后缀表达          式的算法。例如,输入(56-20)/(4+2),输出后缀表达式::56#20#-4#2#+/要求          在数字后加# 输入描述:前缀表达式程序输出:中缀表达式 后缀表达式*/

#include <stdio.h>#include <malloc.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");}
#include <stdio.h>#include <stdlib.h>#include "sqstack.h"#define MaxOp 7struct  //设定运算符优先级{    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;}
运行结果:

总结:

通过栈来解决具体应用问题,有些难,看了好半天。以后得继续加油,多看课本。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 聚水潭暂存位没有箱号怎么办? 长时间不锻炼运动后浑身酸痛怎么办 体脂称身体年龄比实际年龄大怎么办 分手两天我好难过好想去找他怎么办 宝宝一吃药就哭得很厉害怎么办 比你入职晚的同事比你厉害怎么办 nba篮球大师能力值满了怎么办 做什么都觉得很累没有兴趣怎么办 剧烈运动后头晕恶心想吐怎么办 剧烈运动完头晕恶心想吐怎么办 小孩头部摔到地上想吐头晕怎么办 肺部化疗恶心反胃怎么办吃什么药好 好久没运动一运动全身酸痛怎么办 怀孕两个月了一直吐没体力怎么办 公务员审查六级口语证丢了怎么办 农资经营如果被执法查处了怎么办? 干隧道测量坚持不下去该怎么办 老家房子强拆没钱做没钱补怎么办? 魔兽世界出了两个一样的传说怎么办 死亡事故后遇上不讲理家属怎么办 死亡事故后死亡者家属不讲理怎么办 住的地方治安乱混混多怎么办 使命召唤进去感觉动作好慢怎么办 40岁后不够硬不持久怎么办 如果别人毁灭了你的梦想怎么办 如果死者托梦说自己过的不好怎么办 吵架了老婆跑回娘家不回家了怎么办 和老婆吵架她跑回娘家了怎么办 鞋子里面的皮穿的都是泥怎么办 绝地求生手游模拟器键位不灵怎么办 我更新目录的时候目录不存在怎么办 如果别人欠我钱不还 我该怎么办 老婆欠信用卡的钱我该怎么办 我欠了很多钱我该怎么办 一个人欠我钱跑了我该怎么办 买房子时间长了成危楼了怎么办 别人欠我钱人找不到了怎么办 欠银行信用卡钱人失踪了怎么办 欧洲卡车模拟2没油了怎么办 蓝牙安装包里没有微信怎么办 腾讯手游模拟器玩全军出击卡怎么办