| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 763 人关注过本帖
标题:表达式的求值问题
取消只看楼主 加入收藏
遮天云
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:农村一小伙
等 级:贵宾
威 望:12
帖 子:1132
专家分:2671
注 册:2010-6-1
结帖率:100%
收藏
已结贴  问题点数:50 回复次数:5 
表达式的求值问题
程序代码:
#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
遮天云
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
遮天云
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:农村一小伙
等 级:贵宾
威 望:12
帖 子:1132
专家分:2671
注 册:2010-6-1
收藏
得分:0 
以下是引用m21wo在2010-11-3 22:40:35的发言:

这种问题!自己一步步调试啊 !很容易发现啊!
我也一直在每步验证啊,现在我还没放弃自己整呢,我希望我自己能做出来,但是在这个问题上卡这么久我觉得不太合适,要不您帮忙看下,我这里明天在用一个晚上在整整,我就不信我不行了
2010-11-03 22:44
遮天云
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:农村一小伙
等 级:贵宾
威 望:12
帖 子:1132
专家分:2671
注 册:2010-6-1
收藏
得分:0 
以下是引用shinan77在2010-11-4 13:00:51的发言:

问题很简单,你写的程序只能读取十以内的整数,因为你用的是“char”,所以表达式5*(2+14)-28/4中,14和28,程序只能读取首位数1和2,这就会导致运行结果错误。
试试用十以内整数的表达式运行一下。

谢谢你,我还真没发现这个错误,不过还有一个额其他的错误,我还没改好,现在在整下
2010-11-04 19:01
遮天云
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:农村一小伙
等 级:贵宾
威 望:12
帖 子:1132
专家分:2671
注 册:2010-6-1
收藏
得分:0 
以下是引用shinan77在2010-11-4 13:13:35的发言:

你的程序设计的不是很合理,表达式应该是一次性连续输入的,而你的程序是每次只能输入一个操作符,建议你再改进一下。

嗯,这倒是个好建议,等这题该好了我在把程序优化一下
2010-11-04 19:02
遮天云
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:农村一小伙
等 级:贵宾
威 望:12
帖 子:1132
专家分:2671
注 册:2010-6-1
收藏
得分:0 
以下是引用vandychan在2010-11-4 19:08:20的发言:

大哥好

师兄帮忙看看呗,我今晚还有三个程序要写呢,包括这一个
2010-11-04 19:13
快速回复:表达式的求值问题
数据加载中...
 
   



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

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