| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3947 人关注过本帖
标题:谁能做表达式求值啊 求助!!!!!!!!!!!!!!
只看楼主 加入收藏
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
前几天写的支持括号,但是只支持正整数
#include<stdio.h>
#include<stdlib.h>
#include <ctype.h>
#define Stack_Size 50
typedef struct
{
    char elem[Stack_Size];
    int top;
}OpStack;
typedef struct
{
    int elem[Stack_Size];
    int top;
}NumStack;

void Push(OpStack *s,char x);
void Pop(OpStack *s,char *x);
void Push(NumStack *s,int x);
void Pop(NumStack *s,int *x);
int Execute(int a,char c,int b);
int ExpEvaluation(NumStack *OVS,OpStack *OPTR);
void GetNumber(char p);
int Cint(char mychar);
int num=0;
void main()
{   
    int result;
    OpStack OPTR;
    NumStack OVS;
    OVS.top=-1;OPTR.top=-1;
    result=ExpEvaluation(&OVS,&OPTR);
    printf("The result is %d\n",result);
}

void Push(OpStack *s,char x)
{
    s->top++;
    s->elem[s->top]=x;
}
void Pop(OpStack *s,char *x)
{
    *x=s->elem[s->top];
    s->top--;
}
void Push(NumStack *s,int x)
{
    s->top++;
    s->elem[s->top]=x;
}
void Pop(NumStack *s,int *x)
{
    *x=s->elem[s->top];
    s->top--;
}
int Execute(int a,char c,int b)
{
   
     switch(c)
     {
     case '+':return a+b;break;
     case '-':return a-b;break;
     case '*':;return a*b;break;
     case '/':return a/b;break;
     }
     
}

void GetNumber(char p)
{
    num=num*10+Cint(p);
}
int Cint(char mychar)
{
    return (mychar-48);
}
//栈运算符与读入运算符优先级的比较
char Compare(char x,char y)
{
  char priority='<';  
  switch(x)
  {
   case '+':
   case '-':if(y=='#'||y=='+'||y=='-'||y==')')priority='>';break;
   case '*':
   case '/': priority='>';if(y=='(' )priority='<';break;
   case '(':if(y==')')priority='=';break;
   case '#':if(y=='#') priority='=';break;
   default:priority='E';
  }
  return priority;
}
int ExpEvaluation(NumStack *OVS,OpStack *OPTR)
{
     int v,flag=0,f1=1,f2=1;
    char ch,ch1,c;
    int a,b,flag1=1;
    Push(OPTR,'#');
    printf("\n\nputin a string(stop with #):");
    while(ch!='#'||OPTR->elem[OPTR->top]!='#')
    {   if(f1&&f2)
         ch=getchar();
        if(isdigit(ch))
        {
            GetNumber(ch);
            
        }
        else
        {   
            
            if((ch>='0'&&ch<='9'||ch1>='0'&&ch1<='9')&&!flag)
            {   
                Push(OVS,num);            
                num=0;
            }
            switch(Compare(OPTR->elem[OPTR->top],ch))
            {
                                
            case '<':               
                Push(OPTR,ch);
                flag=0;
                break;
            case '>':
                Pop(OPTR,&c);
                Pop(OVS,&b);
                Pop(OVS,&a);
                v=Execute(a,c,b);
               
                if(OPTR->elem[OPTR->top]=='-')
                {
                      v=-1*v;
                      OPTR->elem[OPTR->top]='+';
                }
                    Push(OVS,v);
                if(ch!='#'&&ch!=')')   
                {   
                    
                        Push(OPTR,ch);
                        flag=0;
                }
                else
                {
                    f1=0;
                    flag=1;
                    
                }
               
                //printf("%d %c %d  %d\n",a,c,b,v);
                break;
            case '=':
                Pop(OPTR,&c);
                if(c=='('&&ch==')')
                {   
                    
                        f1=1;
                        flag=1;
                    
                }
                break;
            default:printf("Wrong Express!");exit(0);
               
            }
        }
         ch1=ch;
         
    }
   
    return(v);
}

学习需要安静。。海盗要重新来过。。
2008-04-18 12:13
zjl138
Rank: 1
等 级:新手上路
威 望:1
帖 子:788
专家分:0
注 册:2007-11-12
收藏
得分:0 
呵呵,楼上厉害,我用的是数组,我的整形,浮点都行,还能算平方。我的篇幅太长了,自已看了都头疼,呵呵。。。

i like linux...
2008-04-18 12:23
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
我的没办法.因为只能一个一个字符读取..然后还要分析..当然改一下也可以..呵呵.反正是玩玩..等到有时间的时候给它改版..呵呵

学习需要安静。。海盗要重新来过。。
2008-04-18 12:32
firel
Rank: 1
等 级:新手上路
帖 子:29
专家分:0
注 册:2007-10-4
收藏
得分:0 
强啊  哈哈谢谢啊
2008-04-18 12:33
firel
Rank: 1
等 级:新手上路
帖 子:29
专家分:0
注 册:2007-10-4
收藏
得分:0 
这是怎么了
为什么在我的机子上不能通过我用的是vc++6.0我没学过c++
不要见笑啊
2008-04-18 17:37
zjl138
Rank: 1
等 级:新手上路
威 望:1
帖 子:788
专家分:0
注 册:2007-11-12
收藏
得分:0 
[bo]以下是引用 [un]firel[/un] 在 2008-4-18 17:37 的发言:[/bo]

为什么在我的机子上不能通过我用的是vc++6.0我没学过c++
不要见笑啊

是我的吗,我的在VS2008通过,并测试正确,你用VC6,可以先建一个空的WIN32 console application,然后再一个一个地把文件加进去,注意哪些是头文件,哪些是源文件。
你没学过C++吗?那sunkaidong大哥写得应该看得懂吧,就用他的了。

i like linux...
2008-04-18 18:05
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
用楼上的兄弟的..他的很规范..说实在的..我的程序理解有点难...

学习需要安静。。海盗要重新来过。。
2008-04-18 18:22
zjl138
Rank: 1
等 级:新手上路
威 望:1
帖 子:788
专家分:0
注 册:2007-11-12
收藏
得分:0 
呵呵,楼上谦虚!
另外,我帮楼主你再看了一下源程序,由于你没写注释,我看得比较累,就没认真看,但发现了几个重要错误,就是你使用的变量i,m都没有初始化,还有就是这个警告:warning C4715: 'precede' : not all control paths return a value
其实该算是个错误了:就是你自定义函数里出了错。你希望函数返回某个值,但是可能在函数里加了if等条件判断,使得一部分情况下有返回值,而另一种情况没返回值。我也帮你改了一下。现在能运行了,但发现你没写最后结果的输出函数,这个就你自已加了。呵呵。。。

i like linux...
2008-04-18 18:40
zjl138
Rank: 1
等 级:新手上路
威 望:1
帖 子:788
专家分:0
注 册:2007-11-12
收藏
得分:0 
//下面是我帮你改的:
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define num 20
typedef struct stackf
{
    int *top;
    int *base;
}stack1;
typedef struct stackl
{
    char *top;
    char *base;
}stack2;
char precede(char x,char y)
{
    switch(x)
    {
    case '+':
        if(y=='+'||y=='-'||y==')'||y=='#')
                return '>';
        else
        return '<';
    case '-':
        if(y=='+'||y=='-'||y==')'||y=='#')
                return '>';
        else
        return '<';
    case '*':
        if(y=='(')
            return '<';
        else
            return '>';
    case '/':
        if(y=='(')
            return '<';
        else
            return '>';
    case '(':
        if(y==')')
            return '=';
        else
            if(y=='#')
            break;
        else
            return '<';
    case ')':
        if(y=='(')
        break;
        else
            return '>';
    case '#':
        if(y=='#')
            return '=';
        else
            if(y==')')
        break;
            else
                return '<';
    }
    return 1;
}
void init_stack1(stack1 *st)
{
    st->base=(int *)malloc(num*sizeof(int));
    st->top=st->base;
}
void init_stack2(stack2 *st)
{
    st->base=(char *)malloc(num*sizeof(char));
    st->top=st->base;
}
int empty_stack1(stack1 *st)
{
    if(st->base==st->top)
        return 1;
    return 0;
}
int empty_stack2(stack2 *st)
{
    if(st->base==st->top)
        return 1;
    return 0;
}
int full_stack1(stack1 *st)
{
    if(st->top-st->base>=num)
        return 1;
    return 0;
}
int full_stack2(stack2 *st)
{
    if(st->top-st->base>=num)
        return 1;
    return 0;
}
void push1(stack1 *st,int x)
{
        if(full_stack1(st))
            printf("error");
        else
            *st->top++=x;
}
void push2(stack2 *st,int x)
{
        if(full_stack2(st))
            printf("error");
        else
            *st->top++=x;
}
int pop1(stack1 *st)
{    
    int shuzi;
    shuzi=--*st->top;
    return shuzi;
}
char pop2(stack2 *st)
{    
    char zimu;
    zimu=--*st->top;
    return zimu;
}
char get_top2(stack2 *st)
{

        return *(st->top-1);
}
int operter(int num1,char oper,int num2)
{
    switch(oper)
    {
    case '+':
        return num1+num2;
        break;
    case '-':
        return num1-num2;
        break;
    case '*':
        return num1*num2;
        break;
    case '/':
        return num1/num2;
    }
    return 1;
}
void open()
{
    printf("****************************************\n");
    printf("***作者----------------冯亮*************\n");
    printf("***计算机0602--------------*************\n");
    printf("****************************************\n");
    printf("****请输入您想的操作********************\n");
    printf("0-----------------退出\n");
    printf("1-----------------输入表达式\n");
    printf("2-----------------使用说明\n");
}
void readme()
{
    printf("****************************************\n");
    printf("输入数据!!\n");
    printf("例如 ----1+2*3-4#以#号结束\n");
    printf("谢谢使用^_^!\n");
    printf("****************************************\n");
}
void main()
{    
    int i,x,num1,num2,m=0,e;
    char oper;
    stack1 s;
    stack2 r;
    char a[20];
    init_stack1(&s);
    init_stack2(&r);
    push2(&r,'#');
    while(1)
    {
        open();
        scanf("%d",&i);
        switch(i)
        {
        case 0:
            break;
        case 1:
            printf("请输入表达式!!!!!!!!\n");
            scanf("%s",a);
            while(a[m]!='#')
                {    
                    x=a[m];
                    if(x>=60&&x<=69)
                    {
                        if(a[m-1]>=60&&a[m-1]<=69&&m>0)
                        {
                            e=pop1(&s);
                            e=e*10+(int)(x-'0');
                        }
                        else
                        e=(int)(x-'0');
                        push1(&s,e);
                        m++;
                    }
                    else
                    {
                        switch(precede(get_top2(&r),x))
                        {
                        case '<':
                        push2(&r,x);
                        break;
                        case '>':
                            num1=pop1(&s);
                            num2=pop1(&s);
                            oper=pop2(&r);
                            push1(&s,operter(num1,oper,num2));
                            break;
                        case '=':
                            pop2(&r);
                            break;
                        }
                        m++;
                    }
                }
                break;
        case 2:
            readme();
            break;
        default :
            printf("error");
            break;
        }
                
    }
}

i like linux...
2008-04-18 18:41
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
那个结果问题是我故意的..毕竟我的运算函数只有四个操作符号.....结果有输出啊....没有结果不好判断对错了...呵呵...

[[it] 本帖最后由 sunkaidong 于 2008-4-18 19:06 编辑 [/it]]

学习需要安静。。海盗要重新来过。。
2008-04-18 19:04
快速回复:谁能做表达式求值啊 求助!!!!!!!!!!!!!!
数据加载中...
 
   



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

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