标题:表达式的求值问题
只看楼主
遮天云
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:农村一小伙
等 级:贵宾
威 望:12
帖 子:1132
专家分:2671
注 册:2010-6-1
结帖率:100%
已结贴  问题点数:50 回复次数:15 
表达式的求值问题
程序代码:
#include<stdio.h>
#define StackMaxlSize 100
typedef struct
{
    char stack[StackMaxlSize];
    int top;
}stack1;
typedef struct
{
    char stack[StackMaxlSize];
    int top;
}stack2;
int In(char c)
{
    if((c=='+')||(c=='-')||(c=='*')||(c=='/')||(c=='#')||(c=='(')||(c==')'))
        return 1;
    else
        return 0;
}
void InitStack1(stack1 *S)//初始化操作符空栈
{
    S->top=-1;//负数1表示栈空
}
void InitStack2(stack2 *S)//初始化操作数空栈
{
    S->top=-1;
}
void Push1(stack1 *S,char ch)//操作符入栈
{
    S->top++;
    S->stack[S->top]=ch;
}
void Push2(stack2 *S,char ch)//操作数入栈
{
    S->top++;
    S->stack[S->top]=ch;
}
void Pop1(stack1 *S,char *p)//操作符出栈运算
{
    *p=S->stack[S->top];
    S->top--;
}
void Pop2(stack2 *S,int  *p)//操作数出栈运算
{
    *p=S->stack[S->top];
    S->top--;
}
char Precede(char ch1,char ch2)
{
    char ch;
    printf("现在栈顶元素ch1=%c\n",ch1);
    switch(ch1)
    {
        case '+':
            if((ch2=='*')||(ch2=='/')||(ch2=='('))
                ch='<';
            else
                ch='>';
            break;
        case '-':
            if((ch2=='*')||(ch2=='/')||(ch2=='('))
                ch='<';
            else
                ch='>';
            break;
        case '*':
               if((ch2=='('))
                    ch='<';
            else
                ch='>';
            break;
        case '/':
            if((ch2=='('))
                    ch='<';
            else
                ch='>';
            break;
        case '#':
            if((ch2=='#'))
                ch='=';
            else
                ch='<';
            break;
        case '(':
            if((ch2=='+')||(ch2=='-')||(ch2=='*')||(ch2=='/') )
                 ch='<';
            else
                ch='>';
            break;


    }
    return ch;
}
char GetTop1(stack1 *S)
{
    return
    S->stack[S->top];
    //S->top--;
}
char GetTop2(stack2 *S)
{
    return
    S->stack[S->top];
//    S->top--;
}
void ClearStack1(stack1 *S)//清空操作符栈
{
    S->top=-1;
}
void ClearStack2(stack2 *S)//清空操作符栈
{
    S->top=-1;
}
int Operate(int a,char theta,int b)//核心运算
{
    int Oper;
    char ch=theta;
    switch(ch)
    {
        case '+':Oper=a+b;break;
        case '-': Oper=a-b;break;
        case '*':Oper=a*b;break;
        case '/': Oper=a/b;break;
    }
    return Oper;
}
void main()
{
    stack1  OPTR1,*OPTR=&OPTR1;///操作符栈
    stack2  OPND1,*OPND=&OPND1;//操作数栈
    InitStack1(OPTR);//初始化操作符栈
    Push1(OPTR,'#');//把表达式的起始符号“#”入栈
    InitStack2(OPND);//初始化操作数栈
    char c,x,theta;
    int a,b,s;
    printf("请输入表达式,以#号结束:");
    c=getchar();//接受表达式的第一个字符
    fflush(stdin);
    while((c!='#'||GetTop1(OPTR)!='#'))//#号同时是表达式的截至符号
    {
        fflush(stdin);
        if(!In(c))//判断是否当前表达式字符是算符,不是则进操作数栈
        {
            s=c-'0';
            Push2(OPND,s);
            c=getchar();
            fflush(stdin);
        }
        else//如果是运算符就进操作符栈
        {
            switch(Precede(GetTop1(OPTR),c))//判断当前运算符和栈顶运算符的优先级
            {
                fflush(stdin);
                case '<':Push1(OPTR,c);//栈顶运算符的优先级低于当前运算符,把当前运算符入栈
                          printf("哈哈我进栈了%c\n",c);//验证调用问题
                            c=getchar();
                            fflush(stdin);
                            break;
                case '=':Pop1(OPTR,&x);//两个运算符优先级相同就把栈顶运算符出栈
                            c=getchar();
                            fflush(stdin);
                            break;
                case '>':Pop1(OPTR,&theta);//栈顶运算符的优先级高于当前运算符,把栈顶元素出栈参与运算
                            Pop2(OPND,&b);//连续出栈两个操作数做栈顶运算符的运算
                            Pop2(OPND,&a);
                            Push2(OPND,Operate(a,theta,b));//运算结果如操作数栈
                       
                            c=getchar();
                            break;
            }
        }
    }
    c=GetTop2(OPND);//取出最后运算结果并输出
    printf("表达式运算最终结果为:");
    printf("%d\n",c);
}
   
我这个是针对这个式子5*(2+14)-28/4做的,但是结果就是不对,我也知道问题大概处在什么地方,但是我不知道具体怎么弄了,困扰我一周了,希望大家帮帮忙
搜索更多相关主题的帖子: 求值 表达 
2010-11-03 22:37
vandychan
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
等 级:贵宾
威 望:18
帖 子:2296
专家分:6418
注 册:2010-8-20
得分:0 
太长 也支持一下

到底是“出来混迟早要还”还是“杀人放火金腰带”?
2010-11-03 22:37
m21wo
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:4
帖 子:440
专家分:1905
注 册:2010-9-23
得分:0 
这种问题!自己一步步调试啊 !很容易发现啊!

If You Want Something, Go Get It, Period.
2010-11-03 22:40
遮天云
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:农村一小伙
等 级:贵宾
威 望:12
帖 子:1132
专家分:2671
注 册:2010-6-1
得分:0 
以下是引用vandychan在2010-11-3 22:37:40的发言:

太长 也支持一下
呃,汗,我QQ登不上了,非得要我卸载360所以就在这发帖问了
2010-11-03 22:41
vandychan
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
等 级:贵宾
威 望:18
帖 子:2296
专家分:6418
注 册:2010-8-20
得分:0 
我QQ你。 你不回应我
算了 看下我会的几个帖子吧

到底是“出来混迟早要还”还是“杀人放火金腰带”?
2010-11-03 22:42
遮天云
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:农村一小伙
等 级:贵宾
威 望:12
帖 子:1132
专家分:2671
注 册:2010-6-1
得分:0 
以下是引用m21wo在2010-11-3 22:40:35的发言:

这种问题!自己一步步调试啊 !很容易发现啊!
我也一直在每步验证啊,现在我还没放弃自己整呢,我希望我自己能做出来,但是在这个问题上卡这么久我觉得不太合适,要不您帮忙看下,我这里明天在用一个晚上在整整,我就不信我不行了
2010-11-03 22:44
m21wo
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:4
帖 子:440
专家分:1905
注 册:2010-9-23
得分:15 
呵呵!有前途!我有时间一定帮你糗糗!

If You Want Something, Go Get It, Period.
2010-11-03 22:50
vandychan
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
等 级:贵宾
威 望:18
帖 子:2296
专家分:6418
注 册:2010-8-20
得分:15 
帮你糗糗!

到底是“出来混迟早要还”还是“杀人放火金腰带”?
2010-11-03 23:03
五当家
Rank: 12Rank: 12Rank: 12
等 级:火箭侠
威 望:2
帖 子:1112
专家分:3674
注 册:2010-10-20
得分:5 
接分,不解释。

经验积累中............
2010-11-04 12:54
shinan77
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:87
专家分:188
注 册:2010-9-24
得分:15 
问题很简单,你写的程序只能读取十以内的整数,因为你用的是“char”,所以表达式5*(2+14)-28/4中,14和28,程序只能读取首位数1和2,这就会导致运行结果错误。
试试用十以内整数的表达式运行一下。

--------将学到的东西为我所用,这才是学习的目的 --------
2010-11-04 13:00



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-324909-1-1.html




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

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