标题:请教数据结构算法设计:利用栈设计表达式求值
只看楼主
wuyeqingfeng
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2010-12-21
结帖率:0
已结贴  问题点数:20 回复次数:1 
请教数据结构算法设计:利用栈设计表达式求值
请教数据结构算法设计:利用栈设计表达式求值
本人在设计中遇到一些问题:不能计算例如 -1-(-3)这样的表达式的值,望高手予以指点
本人写的的代码:
#include<stdlib.h>
#include<stdio.h>
#define stack_init_size1 40
#define stack_init_size2 20
#define stackincrement1 40
#define stackincrement2 20
int i=0,j=0,k=0;
static char youxian[7][7]=
    {
    {'>','>','<','<','<','>','>'},
    {'>','>','<','<','<','>','>'},
    {'>','>','>','>','<','>','>'},
    {'>','>','>','>','<','>','>'},
    {'<','<','<','<','<','=','>'},
    {'>','>','>','>','>','>','>'},
    {'<','<','<','<','<','>','='}
    };
typedef struct{
    int *base;
    int *top;
    int stacksize;
}s_stack;
typedef struct{
    char *base;
    char *top;
    int stacksize;
}f_stack;
void s_push(s_stack *s,int e)
{

     if(s->top-s->base>=s->stacksize)
     {
         s->base=(int *)realloc(s->base,(s->stacksize+stackincrement1)*sizeof(int));
         if(!s->base) exit(0);
         s->top=s->base+s->stacksize;
         s->stacksize+=stackincrement1;
     }
    *s->top=e; s->top++;
}
void  f_push(f_stack *f,char e)
{
     if(f->top-f->base>=f->stacksize)
     {
         f->base=(char *)realloc(f->base,(f->stacksize+stackincrement2)*sizeof(char));
         if(!f->base) exit (0);
         f->top=f->base+f->stacksize;
         f->stacksize+=stackincrement2;
     }
     *f->top=e;f->top++;
}

int s_gettop(s_stack *s)
{
    s->top--;
    return *s->top;
}

char f_gettop(f_stack *f)
{
    f->top--;
    return *f->top;
}
int in(char c)
{
    switch(c)
    {
    case '+': return 0;
    case '-': return 1;
    case '*': return 2;
    case '/': return 3;
    case '(': return 4;
    case ')': return 5;
    case '#':return 6;
    default:return 9;
    }

}
char panduan(f_stack *f,char c)
{
    int m,n;
    char w;
    m=in(c);
    w=*(f->top-1);
    n=in(w);
    return youxian[n][m];
}

int yunsuan(int p,char r,int q)
{
        switch(r)
    {
        case '+': return q+p;
        case '-': return q-p;
        case '*': return q*p;
        case '/': return q/p;
    }
}
int goucheng()
{
    s_stack s;
    f_stack f;
    s.base=(int*)malloc(stack_init_size1*sizeof(int));
    if(!s.base) return 0;
    s.top=s.base;
    s.stacksize=stack_init_size1;

    f.base=(char*)malloc(stack_init_size2*sizeof(char));
    if(!f.base) return 0;
    f.top=f.base;
    f.stacksize=stack_init_size2;
    *f.top='#';f.top++;
    int h=0,jieguo,wrong;
    char c;
    c=getchar();
    if(i==0&&c=='-'&&(*(f.top-1)=='#')&&(s.top==s.base))i=1;
    if(k==0&&c=='-'&&(*(f.top-1)=='('))k=1;
    while(c!='\n')
    {   int t;
        int p,q;
        char r;
        if(in(c)==9)
        {   
            if(h>0)
            {
                t=s_gettop(&s);
                s_push(&s,t*10+c-48);
             }
            else
                if(i==1||j>0||k==1)
                {
                    s_push(&s,0);
                    s_push(&s,c-48);
                    i++;k=0;
                }
                else
                    s_push(&s,c-48);
                h++;
                c=getchar();
        }
        else
        switch(panduan(&f,c))
        {
          case '<':
               f_push(&f,c);c=getchar();h=0;break;
          case '=':
              if(k=1)
              {
                  f.top=f.top-2;
                  f.stacksize=f.stacksize-2;
                  c=getchar();h=0;break;
              }
              else
              {
                  f.top--;
                  f.stacksize--;
                  c=getchar();h=0;break;
              }
          case '>':
               p=s_gettop(&s);
               q=s_gettop(&s);
               r=f_gettop(&f);
             if(r=='/'&&p==0)
               {wrong=1;break;}
             else
               {
                 jieguo=yunsuan(p,r,q);
                 s_push(&s,jieguo);h=0;break;
               }
        }
    }
    while((c=='\n')&&(*(f.top-1)!='#'))
    {
        int p,q;
        char r;
        p=s_gettop(&s);
        q=s_gettop(&s);
        r=f_gettop(&f);
    if(r=='/'&&p==0)
        {wrong=1;break;}
    else
        jieguo=yunsuan(p,r,q);
        s_push(&s,jieguo);
    }
    if(wrong==1)
        printf("It is wrong!\n");
    else
        printf("the answer is %d\n",s_gettop(&s));
}
int main()
{
    printf("please press the shizi end by enter!\n");
    goucheng();
}
搜索更多相关主题的帖子: 数据结构 求值 算法设计 表达 
2010-12-21 16:58
诸葛修勤
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:11
帖 子:549
专家分:1955
注 册:2010-10-28
得分:20 
为了区分  改成不同的符号就可以啦
应为 开始设计的时候 + - * / 都是 二元的
而负号是一元的 而且优先级 最高  
所以最简单的方法就是用别的符号代替负号

2010-12-26 08:15



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




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

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