| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 466 人关注过本帖
标题:用栈来求解表达式,我不知道我的代码哪里错了,麻烦指导下
只看楼主 加入收藏
支风儿
Rank: 2
等 级:论坛游民
帖 子:25
专家分:13
注 册:2013-4-6
结帖率:100%
收藏
 问题点数:0 回复次数: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 n,k=0;
    char c,theta;
    InitStack_R(OPTR);
    Push_R(OPTR,'=');
    InitStack_D(OPND);
    c=getchar();
    while((c!='=')||(GetTop_R(OPTR))!='=')
    {
        if(!In(c))
        { 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));
        break;

        }}
        else
        {
            //转换成int类型
            if(k==0)
            {   n=c-'0';
                Push_D(OPND,n);
                c=getchar();
                k=1;
            }
            if(k==1)
            {
                Pop_D(OPND,n);
                n=n*10+c-'0';
                Push_D(OPND,n);
                c=getchar();
                k=1;
            }
        }
        printf("%d",GetTop_D(OPND));
        return 0;

    }

}
搜索更多相关主题的帖子: 指导 include return 表达式 
2013-04-09 12:35
快速回复:用栈来求解表达式,我不知道我的代码哪里错了,麻烦指导下
数据加载中...
 
   



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

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