| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1074 人关注过本帖
标题:栈的算术优先级问题,不知道写的代码里面的问题在哪,出不来结果
只看楼主 加入收藏
大小熊
Rank: 2
来 自:hu nan
等 级:论坛游民
帖 子:4
专家分:10
注 册:2015-12-13
结帖率:100%
收藏
已结贴  问题点数:25 回复次数:2 
栈的算术优先级问题,不知道写的代码里面的问题在哪,出不来结果


#include<stdio.h>
#include<stdlib.h>
#define ok 1
#define ERROR 0
char an[7]={'+','-','*','/','(',')','='};
unsigned char Prior[7][7]=
{
 // '+' '-' '*' '/' '(' ')' '='   
    /*'+'*/'>','>','<','<','<','>','>',   
    /*'-'*/'>','>','<','<','<','>','>',  
    /*'*'*/'>','>','>','>','<','>','>',  
    /*'/'*/'>','>','>','>','<','>','>',   
    /*'('*/'<','<','<','<','<','=',' ',   
    /*')'*/'>','>','>','>',' ','>','>',
     /*'='*/'<','<','<','<','<',' ','='
};
char Return(char x,char y){
    int a,b;
    for (int i=0;i<7;i++){
    if(an[i]==x)
        a=i;
    if(an[i]==y)
        b=i;
    }
return Prior[a][b];
}
typedef struct{
char *top;
char *base;
int stacksize;
}SqStack1;
typedef struct{
float  *top;
float *base;
int  stacksize;
}SqStack;
int ln(char c,SqStack &S)
{
    switch(c){
    case'1':
    case'2':
        case'3':
        case'4':
        case'5':
        case'6':
        case'7':
        case'8':
        case'9':
        case'0':return 0;break;
        default:return 1;break;
    }//switch
}

float GetResult(float k1,float k2,char c)
{
    float z;
    switch(c){
    case'+':z=k1+k2;break;
    case'-':z=k1-k2;break;
    case'*':z=k1*k2;break;
    case'/':z=k1/k2;break;
    }
    return z;
}


float GetTopFloat(SqStack &S)
{
float e;
e=*(S.top-1);
return(e);
}

char GetTopChar(SqStack1 &S)
{
char e;
e=*(S.top-1);
return(e);
}

float  PopFloat(SqStack &T)
{
if(T.top==T.base) return ERROR;
float e=*(--T.top);
return (e);
}
char PopChar(SqStack1 &T)
{
if(T.top==T.base) return ERROR;
char e=*(--T.top);
return (e);
}

int PushFloat(SqStack &S,char  x){
    float t;
    switch(x){
    case'0':t=0;break;
    case'1':t=1;break;
    case'2':t=2;break;
    case'3':t=3;break;
    case'4':t=4;break;
    case'5':t=5;break;
    case'6':t=6;break;
    case'7':t=7;break;
    case'8':t=8;break;
    case'9':t=9;break;
}
if(S.top-S.base>=S.stacksize){
    S.base=(float*)realloc(S.base,(S.stacksize+100)*sizeof(float));
if(!S.base) return ERROR;
S.top=S.base+S.stacksize;
S.stacksize+=100;
}

    *(S.top++)=t;return ok;
}
int PushChar(SqStack1 &S,char x){
    if(S.top-S.base>=S.stacksize){
    S.base=(char*)realloc(S.base,(S.stacksize+100)*sizeof(char));
if(!S.base)
return ERROR;
S.top=S.base+S.stacksize;
S.stacksize+=100;}
    *(S.top++)=x; return ok;
}

float tra(SqStack &S,SqStack1 &T)
{
    char c;
    c=getchar();
while(c!='='||GetTopChar(T)!='='){
    if(!ln(c,S))
    {PushFloat(S,c);c=getchar();}
    else
        switch(Return(GetTopChar(T),c)){
    case'<':
        PushChar(T,c);c=getchar();break;
    case'=':
        PopChar(T);c=getchar();break;
    case'>':
    char e1=PopChar(T);
    float t1=PopFloat(S); float t2=PopFloat(S);
    PushFloat(S,GetResult(t2,t1,e1));
    break;
    }//switch
}//while
return (GetTopFloat(S));
}
int InitStackFloat(SqStack &S){
S.base=(float *)malloc(100*sizeof(float));
if(!S.base)
return ERROR;
S.top=S.base;
S.stacksize=100;
return ok;
}

int InitStackChar(SqStack1 &S){
S.base=(char *)malloc(100*sizeof(char));
if(!S.base)
return ERROR;
S.top=S.base;
S.stacksize=100;
return ok;
}
void main(){
SqStack S;
SqStack1 T;
InitStackFloat(S);
InitStackChar(T); PushChar(T,'=');
printf("请输入:\n");
printf("%f\n",tra(S,T));
}
搜索更多相关主题的帖子: include 优先级 
2015-12-13 19:22
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:18 
这代码应该只有写的人看的懂,vc6下简单调试了下,发现char Return(char x,char y)函数最后返回时b的值未初始化,所以修改该函数如下:
char Return(char x,char y){
    int a=x,b=y;
    for (int i=0;i<7;i++){
    if(an[i]==x)
        a=i;
    if(an[i]==y)
        b=i;
    }
    return Prior[a][b];
}
可以运行,但运行结果有点悲剧,如下:
图片附件: 游客没有浏览图片的权限,请 登录注册


能编个毛线衣吗?
2015-12-13 19:43
大小熊
Rank: 2
来 自:hu nan
等 级:论坛游民
帖 子:4
专家分:10
注 册:2015-12-13
收藏
得分:0 
回复 2楼 wmf2014
OperandType EvaluateExpression( ) {  // 算法3.4  算术表达式求值的算符优先算法。
   // 设OPTR和OPND分别为运算符栈和运算数栈,OP为运算符集合。
   InitStack (OPTR);   Push (OPTR, '#');
   InitStack (OPND);   c = getchar();
   while (c!= '#' || GetTop(OPTR)!= '#') {
     if (!In(c, OP)) {Push(OPND, c); c=getchar();} // 不是运算符则进栈
     else   
         switch (precede(GetTop(OPTR), c)) {
            case '<':   // 栈顶元素优先权低
                 Push(OPTR, c); c=getchar();      break;
            case '=':   // 脱括号并接收下一字符
                 Pop(OPTR, x); c=getchar();       break;
            case '>':   // 退栈并将运算结果入栈
                 Pop(OPTR, theta);
                 Pop(OPND, b);        Pop(OPND, a);                     
                 Push(OPND, Operate(a, theta, b));
                 break;
         } // switch
    } // while
   return GetTop(OPND);
} // EvaluateExpression

这是代码的算法,是一个简单的算术优先级用栈实现的算法。还有那个函数的a和b未初始化不影响吧??那个函数主要是判断放运算符的栈,栈顶元素和新读入的元素的优先级,如果优先级高则直接入栈,优先级低则先出栈。
2015-12-14 10:30
快速回复:栈的算术优先级问题,不知道写的代码里面的问题在哪,出不来结果
数据加载中...
 
   



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

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