鱼C论坛

 找回密码
 立即注册
查看: 3731|回复: 1

[已解决]怎么把小甲鱼的中缀变后缀和逆波兰表达式结合

[复制链接]
发表于 2015-12-31 14:31:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
//SqStack头文件 建立了两个栈
#ifndef SQSTACK_H_INCLUDED
#define SQSTACK_H_INCLUDED


#endif // SQSTACK_H_INCLUDED
#include<iostream>
using namespace std;
#include<stdlib.h>
#include "Status.h"
#define MAXSIZE 80      //栈的储存空间初始分配量
typedef char SElemtype;
typedef double SSElemtype;
typedef struct
{
    SElemtype *base;    //栈底指针
    SElemtype *top;     //栈顶指针
    int stacksize;      //最大容量
}SqStack;
Status InitStack(SqStack &S)        //栈的初始化
{
    S.base=new SElemtype[MAXSIZE];  //分配最大容量为MAXSIZE的数组空间
    if(!S.base)  exit(OVERFLOW);    //存储分配失败
    S.top=S.base;                   //初始为空栈
    S.stacksize=MAXSIZE;            //stacksize设置为栈的最大容量MAXSIZE
    return OK;
}
Status Push(SqStack &S,SElemtype e) //入栈
{
    if((S.top-S.base)==S.stacksize) //判断栈满
        return ERROR;
    else
    {
        *S.top=e;
        ++S.top;                    //栈顶指针加1
    }
    return OK;
}
Status Pop(SqStack &S,SElemtype &e)  //出栈
{
    if(S.top==S.base)               //栈空
        return ERROR;
    else
    {

        --S.top;
        e=*S.top;                   //栈顶指针减1
    }
    return OK;
}
Status StackLen(SqStack S)          //求栈长
{
    return(S.top-S.base);
}
int GotTop(SqStack S)         //取栈顶元素
{
    if(S.top!=S.base)
        return *(S.top-1);
    return 0;
}
void SqStackTraverse(SqStack S)//遍历
{
    SElemtype *p;
    p=S.base;
    while(S.top!=p)
    {
        cout<<*p++<<" ";
    }
    cout<<endl;
}
//数字栈
typedef struct
{
    SSElemtype *bases;
    SSElemtype *tops;
    int Stacksizes;
}SqStacks;
Status InitStacks(SqStacks &SS)         //初始化
{
    SS.bases=new SSElemtype[MAXSIZE];
    if(!SS.bases) exit(OVERFLOW);
    SS.tops=SS.bases;
    SS.Stacksizes=MAXSIZE;
    return OK;
}
Status Pushs(SqStacks &SS,SSElemtype &e)   //入栈
{
    if((SS.tops-SS.bases)==SS.Stacksizes)
    {
        return ERROR;
    }
    else
    {
        *SS.tops=e;
        ++SS.tops;
    }
    return OK;
}
Status Pops(SqStacks &SS,SSElemtype &e) //出栈
{
    if(SS.bases==SS.tops)
        return ERROR;
    else
    {
        --SS.tops;
        e=*SS.tops;
    }
    return OK;
}
Status SqStackSlen(SqStacks &SS)         //求栈长
{
    return(SS.tops-SS.bases);
}
//////////////////main
//中缀后缀转换
int main()
{
    SqStack S;
    SqStacks SS;
        SElemtype e,c;
        InitStack(S);
        cout<<"请输入中缀表达式,以 '#' 作为结尾!";
        cin>>c;
        while('#'!=c)
    {
        while('0'<= c && '9'>= c)
        {
            cout<<c;
            cin>>c;
            if(c<'0'||c>'9')
            {
                cout<<" ";
            }
        }
        if(')'==c)
        {
            Pop(S,e);
            while('('!=e)
            {
                cout<<e<<" ";
                Pop(S,e);
            }
        }
        else if('+'==c||'-'==c)
        {
            if(!StackLen(S))
            {
                Push(S,c);
            }
            else
            {
                do
                {
                     Pop(S,e);
                     if('('==e)
                     {
                         Push(S,e);
                     }
                     else
                     {
                         cout<<e<<" ";
                     }
                }while(StackLen(S) && '('!=e);
                Push(S,c);
            }
        }
        else if( '*'==c || '/'==c )
        {
                if(StackLen(S))
                {
                    Pop(S,e);
                    while('('!=e&&'+'!=e&&'-'!=e)
                    {
                        cout<<e<<" ";
                        Pop(S,e);
                    }
                    Push(S,e);
                }
                Push(S,c);
        }
        else if( '*'==c || '/'==c )
        {
                if(StackLen(S))
                {
                        Pop(S,e);
                        while('('!=e&&'+'!=e&&'-'!=e)
                        {
                                cout<<e<<" ";
                                Pop(S,e);
                        }
                        Push(S,e);
                }
                Push(S,c);

        }
        else if('('==c)
        {
            Push(S,c);
        }
        else if('#'==c)
        {
            break;
        }
        else
        {
            cout<<"\n输入格式错误!\n";
            return INFEASIBLE;
        }
        cin>>c;
    }
    while(StackLen(S))
    {
        Pop(S,e);
        cout<<e<<" ";
    }
    return 0;
}
//逆波兰
int main()
{
    SqStacks SS;
    char c;
    double d,f,t;
    char str[MAXBUFFER];            //最大缓冲区
    int i=0;
    InitStacks(SS);
    cout<<"请输入后缀表达式:"<<endl;
    cin>>c;
    while('#'!= c)
    {
        while(isdigit(c) || '.'==c) //过滤数字
        {
            str[i++]=c;
            str[i]='\0';
            if(i>=10)
            {
                cout<<"输入单个数据过大!";
                return ERROR;
            }
            c=cin.get();
            if(c==' ')
            {
                d=atof(str);
                Pushs(SS,d);
                i=0;
                break;
            }
        }
        switch(c)
        {
            case '+':
                Pops(SS,f);
                Pops(SS,d);
                t=d+f;
                Pushs(SS,t);
                break;
            case '-':
                Pops(SS,f);
                Pops(SS,d);
                t=d-f;
                Pushs(SS,t);
                break;
            case '*':
                Pops(SS,f);
                Pops(SS,d);
                t=d*f;
                Pushs(SS,t);
                break;
            case '/':
                Pops(SS,f);
                Pops(SS,d);
                if(f!=0)
                {
                    t=d/f;
                    Pushs(SS,t);
                }
                else
                {
                    cout<<"\n输入错误!除数为零!"<<endl;
                    return ERROR;
                }
           }
           cin>>c;
    }
    Pops(SS,d);
    cout<<"最终的计算结果为"<<d<<endl;
    return 0;
}
//Status头文件
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
最佳答案
2016-1-1 20:29:09
怎么把小甲鱼的中缀变后缀和逆波兰表达式结合?——写一个逆波兰计算器就好了~视频好像有说过...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-1-1 20:29:09 | 显示全部楼层    本楼为最佳答案   
怎么把小甲鱼的中缀变后缀和逆波兰表达式结合?——写一个逆波兰计算器就好了~视频好像有说过...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-7-5 03:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表