| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 720 人关注过本帖
标题:表达式求值 调了一天, 手打伤不起啊 哪位路过的搭救一下
只看楼主 加入收藏
凉粉呵呵
Rank: 1
等 级:新手上路
帖 子:73
专家分:0
注 册:2013-2-10
结帖率:81.82%
收藏
已结贴  问题点数:5 回复次数:9 
表达式求值 调了一天, 手打伤不起啊 哪位路过的搭救一下
//利用栈编写表达式求值程序:输入含有“+”、“-”、“*”、“/”四则运算的表达式,
//其中负数要用(0-正数)表示,
//并以#结束。要求输出表达式的值

#include<malloc.h>
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define    OVERFLOW -2
#define STACK_INIT_SIZE 100 // 存储空间初始分配量
#define STACKINCREMENT 10 // 存储空间分配增量

typedef int SElemType; // 定义栈元素类型
typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等

struct SqStack1
{
     SElemType *base; // 在栈构造之前和销毁之后,base的值为NULL
     SElemType *top; // 栈顶指针
     int stacksize; // 当前已分配的存储空间,以元素为单位
}; // 顺序栈


struct SqStack2
{
     char *base; // 在栈构造之前和销毁之后,base的值为NULL
     char *top; // 栈顶指针
     int stacksize; // 当前已分配的存储空间,以元素为单位
}; // 顺序栈


Status InitStack1(SqStack1 &S)      
{      
// 构造一个空栈S,该栈预定义大小为STACK_INIT_SIZE

    S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));                                        //动态分配注意前后括号的内容,区分线性和链式两种
    if(!S.base)exit(OVERFLOW);
    S.top=S.base;
    S.stacksize=STACK_INIT_SIZE;
    return OK;
}

Status InitStack2(SqStack2 &S)      
{      
// 构造一个空栈S,该栈预定义大小为STACK_INIT_SIZE

    S.base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));                                        //动态分配注意前后括号的内容,区分线性和链式两种
    if(!S.base)exit(OVERFLOW);
    S.top=S.base;
    S.stacksize=STACK_INIT_SIZE;
    return OK;
}

Status Push1(SqStack1 &S,SElemType e)   
{
// 在栈S中插入元素e为新的栈顶元素
    if(S.top-S.base>=S.stacksize)
    {
        S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
        if(!S.base)exit(OVERFLOW);
        S.top=S.base+S.stacksize;
        S.stacksize+=STACKINCREMENT;
    }
    *S.top=e;
    *S.top++;
    return OK;

   
}
Status Push2(SqStack2 &S,char e)   
{
// 在栈S中插入元素e为新的栈顶元素
    if(S.top-S.base>=S.stacksize)
    {
        S.base=(char*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(char));
        if(!S.base)exit(OVERFLOW);
        S.top=S.base+S.stacksize;
        S.stacksize+=STACKINCREMENT;
    }
    *S.top=e;
    *S.top++;
    return OK;

   
}

Status Pop1(SqStack1 &S,SElemType &e)   
{
// 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
    if(S.top==S.base)
        return ERROR;
    e=*(S.top-1);
    S.top--;
    return OK;

   
}
Status Pop2(SqStack2 &S,char &e)   
{
// 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
    if(S.top==S.base)
        return ERROR;
    e=*(S.top-1);
    S.top--;
    return OK;

   
}

Status GetTop1(SqStack1 S)   
{
// 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
    SElemType e;
    if(S.top==S.base)
        return ERROR;
    e=*(S.top-1);
    return e;

   
}
Status GetTop2(SqStack2 S)   
{
// 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
    char e;
    if(S.top==S.base)
        return ERROR;
    e=*(S.top-1);
    return e;

   
}




Status Operate(int a,char theta, int b)                                    //计算函数,此处要注意的是a,b都是字符,是char类型函数中做出相应的转化
{   
    a=a;
    b=b;
    if(theta=='+')
        return a+b;
    else if(theta=='-')
        return a-b;
    else if(theta=='*')
        return a*b;
    else if(theta=='/')
        return a/b;
    else
        return ERROR;
}

Status In(char c)
{
    if((c>='0')&&(c<'9'))
        return ERROR;
    else
        return OK;
}


char Bijiao(char a,char c)                                    //a为符号帐顶元素,c为新输入的帐的元素,此函数确定运算符之间的优先级
{
    if(a=='+')
    {
        if(c=='+')        return '>';
        else if(c=='-')return '>';
        else if(c=='*')return '<';
        else if(c=='/')return '<';
        else if(c=='(')return '>';
        else if(c==')')return '>';
        else if(c=='#')return '>';
    }
    if(a=='-')
    {
        if(c=='+')        return '>';
        else if(c=='-')return '>';
        else if(c=='*')return '<';
        else if(c=='/')return '<';
        else if(c=='(')return '<';
        else if(c==')')return '>';
        else if(c=='#')return '>';
    }
    if(a=='*')
    {
        if(c=='+')        return '>';
        else if(c=='-')return '>';
        else if(c=='*')return '>';
        else if(c=='/')return '>';
        else if(c=='(')return '<';
        else if(c==')')return '>';
        else if(c=='#')return '>';
    }
    if(a=='/')
    {
        if(c=='+')        return '>';
        else if(c=='-')return '>';
        else if(c=='*')return '>';
        else if(c=='/')return '>';
        else if(c=='(')return '<';
        else if(c==')')return '>';
        else if(c=='#')return '>';
    }
    if(a=='(')
    {
        if(c=='+')        return '<';
        else if(c=='-')return '<';
        else if(c=='*')return '<';
        else if(c=='/')return '<';
        else if(c=='(')return '<';
        else if(c==')')return '=';
        else if(c=='#')return ERROR;
    }
   
    if(a==')')
    {
        if(c=='+')        return '>';
        else if(c=='-')return '>';
        else if(c=='*')return '>';
        else if(c=='/')return '>';
        
        else if(c==')')return '>';
        else if(c=='#')return '>';
    }
    if(a=='#')
    {
        if(c=='+')        return '<';
        else if(c=='-')return '<';
        else if(c=='*')return '<';
        else if(c=='/')return '<';
        else if(c=='(')return '<';
   
        else if(c=='#')return '=';
    }
    return 0;
}

Status StackTraverse1(SqStack1 S)
{
// 从栈顶到栈底依次输出栈中的每个元素
    SElemType *p = (SElemType *)malloc(sizeof(SElemType));
    p = S.top;                                                        //这个地方还不用p=S。top-1,因为后续已经有减1的
   
        printf("The Stack is: ");
        p--;                                                                //已经在此处减1
        while(p>=S.base)                                                    //等于base还需输出 否则少一个,base还有数据域                                       
        {
            printf("%d ", *p);
                         //请填空
            p--;
        }

    printf("\n");
    return OK;
}

 
Status StackTraverse2(SqStack2 S)
{
// 从栈顶到栈底依次输出栈中的每个元素
    char *p = (char *)malloc(sizeof(char));
    p = S.top;                                                        //这个地方还不用p=S。top-1,因为后续已经有减1的
   
        printf("The Stack is: ");
        p--;                                                                //已经在此处减1
        while(p>=S.base)                                                    //等于base还需输出 否则少一个,base还有数据域                                       
        {
            printf("%c ", *p);
                         //请填空
            p--;
        }

    printf("\n");
    return OK;
}



Status Evaluate()                                                //表达式求值的算术优先算法,符帐OPTR,数帐OPND,OP为运算符集合
{
   
    SqStack2 OPTR;
    SqStack1 OPND;
    char c,x,theta;
    int a,b;
    InitStack2(OPTR);Push2(OPTR,'#');

    InitStack1(OPND);c=getchar();//Push1(OPND,c);

    //StackTraverse2(OPTR);        
    //StackTraverse1(OPND);
    while(c!='#'||GetTop2(OPTR)!='#')                            //Gettop不能直接用整形那个
    {
        if(!In(c)){Push1(OPND,c-'0');c=getchar();/*StackTraverse1(OPND);printf("%d\n",GetTop1(OPND));*/}                    //不是运算符的进帐,即数进数帐
        else
            switch(Bijiao(GetTop2(OPTR),c))
        {    //printf("%c\n",GetTop2(OPTR));
            case'<':
                Push2(OPTR,c);
            printf("%c\n",GetTop2(OPTR));
                c=getchar();
                break;
            case'=':
                Pop2(OPTR,x);
                c=getchar();
                break;
            case'>':
                Pop2(OPTR,theta);
                Pop1(OPND,b);
                Pop1(OPND,a);
                Push1(OPND,Operate(a,theta,b));
            //    printf("%d\n",GetTop1(OPND));
                break;
        }
    }
    StackTraverse2(OPTR);
    printf("%d\n",GetTop1(OPND));
   
    return GetTop1(OPND);
}
int main()
{
        Evaluate();
        
        return 0;
}


说明:是利用帐来做的,其中有关1的都是数帐,而2的是表示符号帐,注释掉的那些是用来调的~谢谢  
搜索更多相关主题的帖子: 表达式 include 存储 
2013-04-04 10:03
笑傲
Rank: 8Rank: 8
来 自:迪拜
等 级:蝙蝠侠
威 望:5
帖 子:223
专家分:856
注 册:2013-3-9
收藏
得分:5 
回复 楼主 凉粉呵呵
有几个比较低级的错误,首先push1,push2函数中,不是*S.top++,应该是S.top++.
另外你的比较优先级的函数中有个地方写错了,if(a=='+') 时如果c为'(',则此时应该是将'('进栈哦,所以应该是'<',
我觉得你的函数还有待改进,因为好像不能处理二位数以上的,如12+1这种的;
我也是初学编程,如果我说的不对,请不要见怪!!

练就一身本领,只为笑傲江湖!
2013-04-04 11:55
凉粉呵呵
Rank: 1
等 级:新手上路
帖 子:73
专家分:0
注 册:2013-2-10
收藏
得分:0 
回复 2楼 笑傲
谢谢  但是有些测试数据不知为什么过不了  即没有结果输出  如3*(9-7)#   和9-(9-7)#等
2013-04-05 00:54
笑傲
Rank: 8Rank: 8
来 自:迪拜
等 级:蝙蝠侠
威 望:5
帖 子:223
专家分:856
注 册:2013-3-9
收藏
得分:0 
回复 3楼 凉粉呵呵
哦,我知道了,你的in(char c)这个函数中,应该是c<='9',而不是c<'9';你再去试试吧,有错的话欢迎一起探讨;

练就一身本领,只为笑傲江湖!
2013-04-05 13:15
凉粉呵呵
Rank: 1
等 级:新手上路
帖 子:73
专家分:0
注 册:2013-2-10
收藏
得分:0 
回复 4楼 笑傲
原来是这里   改完之后可以跑了   但是过oj的时候还是提示error  不知闹哪样
2013-04-06 09:22
凉粉呵呵
Rank: 1
等 级:新手上路
帖 子:73
专家分:0
注 册:2013-2-10
收藏
得分:0 
回复 4楼 笑傲
应该是要求多位数的  题目没有明确是几位数的  回头再调调  谢谢~
2013-04-06 13:51
笑傲
Rank: 8Rank: 8
来 自:迪拜
等 级:蝙蝠侠
威 望:5
帖 子:223
专家分:856
注 册:2013-3-9
收藏
得分:0 
回复 5楼 凉粉呵呵
我试的时候只要不出现2位数或者以上的,好像就没问题。我只能帮到这了。

练就一身本领,只为笑傲江湖!
2013-04-06 15:10
支风儿
Rank: 2
等 级:论坛游民
帖 子:25
专家分:13
注 册:2013-4-6
收藏
得分:0 
我做着和你差不多的题目。你参考下吧。。
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define ERROR 0
#define OK 1
#define SElemType int
#include<stdio.h>
#include<malloc.h>

typedef int Status;

struct SqStack_D{
  SElemType *base;
  SElemType *top;
  int stacksize;
};
struct SqStack_R
{
    char *base;
    char *top;
    int stacksize;
};
Status InitStack_R(SqStack_R &S)    //构造空栈(运算符)
{
    S.base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));
    if(!S.base)
    return ERROR;
    S.top=S.base;
    S.stacksize=STACK_INIT_SIZE;
    return OK;
}
Status InitStack_D(SqStack_D &S)    //构造空栈(操作数)
{
    S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
    if(!S.base)
    return ERROR;
    S.top=S.base;
    S.stacksize=STACK_INIT_SIZE;
    return OK;
}
int GetTop_D(SqStack_D S) //若栈不空,用E返回S的栈顶元素,否则返回ERROR
{   int e;
    if(S.top==S.base)
    return ERROR;
    e=*(S.top-1);
    return e;
}
char GetTop_R(SqStack_R S) //若栈不空,用E返回S的栈顶元素,否则返回ERROR
{   char e;
    if(S.top==S.base)
    return ERROR;
    e=*(S.top-1);
    return e;
}
Status Push_D(SqStack_D &S,SElemType e )  //插入元素e为新的栈顶元素
{
    if(S.top-S.base>=S.stacksize)
    {
        S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
        if(!S.base)
        return ERROR;
        S.top=S.base+S.stacksize;
        S.stacksize+=STACKINCREMENT;
    }
    *S.top++=e;
    return OK;
}
int Push_R(SqStack_R &S,char e )  //插入元素e为新的栈顶元素
{
    if(S.top-S.base>=S.stacksize)
    {
        S.base=(char*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(char));
        if(!S.base)
        return ERROR;
        S.top=S.base+S.stacksize;
        S.stacksize+=STACKINCREMENT;
    }
    *S.top++=e;
    return OK;
}
int Pop_D(SqStack_D &S,SElemType &e)     //若栈不空,则删除S的栈顶元素,用e返回其值,把那个返回OK;否则返回ERROR
{
    if(S.top==S.base)
    return ERROR;
    e=*--S.top;
    return OK;
}
int Pop_R(SqStack_R &S,char &e)
{
    if(S.base==S.top)
    return ERROR;
    e=*--S.top;
    return OK;
}
int In(char c)     //判断输入是否是运算符
{
    if(c>='0'&&c<='9')
    return OK;
    else
    return ERROR;
}
char precede(char c,char e)  //判断运算符的优先级高低
{
    if((c=='+')||(c=='-'))
    {
        if((e=='*')||(e=='/')||(e=='('))
           return '<';
        else
           return '>';
    }
    if((c=='*')||(c=='/'))
    {
        if(e=='(')
           return '<';
        else
           return '>';
    }
    if(c=='(')
       {
           if(e==')')
             return '=';
           else
           return '<';
       }
    if(c==')')
    return '>';
    if(c=='=')
    {
      if(e=='=')
        return '=';
    else
        return '<';
    }
}
char Precede(char theta1,char theta2)
{
    int a,b;
    switch(theta1)
    {
        case'+':a=2;break;
        case'-':a=2;break;
        case'*':a=4;break;
        case'/':a=4;break;
        case'(':a=0;break;
        case')':a=6;break;
        case'=':a=-2;break;
    }
    switch(theta2)
    {
        case'+':b=1;break;
        case'-':b=1;break;
        case'*':b=3;break;
        case'/':b=3;break;
        case'(':b=6;break;
        case')':b=0;break;
        case'=':b=-2;break;
    }
    if(a>b)
    return '>';
    else if(a==b)
    return '=';
    else return '<';
}
int Operate(int a,char theta,int b)
{
    int s;
    switch(theta)
    {
        case'+':s=a+b;break;
        case'-':s=a-b;break;
        case'*':s=a*b;break;
        case'/':if(b!=0) s=a/b;
                 else printf("Error input");
                 break;
    }
    return s;
}
int main()
{   SqStack_D OPND;
     SqStack_R OPTR;
    int a,b;
    int y,m,k=0;
    char c,theta;
    InitStack_R(OPTR);
    Push_R(OPTR,'=');
    InitStack_D(OPND);
    c=getchar();
    while(c!='='||GetTop_R(OPTR)!='=')
    {
        if(In(c))   //是运算符
        {
            m=c-'0';   //转换成INT型
            if(k==1)
            {
                Pop_D(OPND,y);    //栈中数字出栈
                y=m+y*10;         //数字字符转换成数字
                Push_D(OPND,y);   //数字进栈
                k=1;
                c=getchar();
            }
            else
            {
                y=m;
                Push_D(OPND,y);   //数字进栈
                c=getchar();     //接受下一个字符
                k=1;             //k标志一种状态
            }
        }
        else
            {
                k=0;
                switch(Precede(GetTop_R(OPTR),c))
                {
                case '<': Push_R(OPTR,c); c=getchar(); break;
                case '=': Pop_R(OPTR,c); c=getchar(); break;
                case '>':
                    Pop_R(OPTR,theta);
                    Pop_D(OPND,b);
                    Pop_D(OPND,a);
                    Push_D(OPND,Operate(a,theta,b));   //a b间的运算
                    break;
                }
            }
    }
    printf("%d",GetTop_D(OPND));
    return 0;
}
2013-04-09 15:37
凉粉呵呵
Rank: 1
等 级:新手上路
帖 子:73
专家分:0
注 册:2013-2-10
收藏
得分:0 
回复 7楼 笑傲
应该是多位数的问题  改完之后OK了  谢谢受教了
2013-04-10 23:14
凉粉呵呵
Rank: 1
等 级:新手上路
帖 子:73
专家分:0
注 册:2013-2-10
收藏
得分:0 
回复 8楼 支风儿
谢谢
2013-04-10 23:15
快速回复:表达式求值 调了一天, 手打伤不起啊 哪位路过的搭救一下
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018066 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved