| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 710 人关注过本帖
标题:中缀表达式转后缀表达式的问题
只看楼主 加入收藏
sun110115
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2015-7-2
结帖率:100%
收藏
 问题点数:0 回复次数:0 
中缀表达式转后缀表达式的问题
int isNum( char c)//判断是否为数字
{
    int ret = 0;
    if('0'<= c &&  c<= '9')
    {
        ret = 1;   
    }
    else
    {
        ret = 0;   
    }
   
    return ret;
}
int isOperator( char c)//判断是否为运算符
{
    int ret = 0;
    switch(c)
    {
        case '+':
        case '-':
        case '*':
        case '/':
            ret = 1;
            break;
        default:
            ret = 0;
            break;   
    }
   
    return ret;
   
}

void output( char c)//输出
{
    if('\0'!= c)
    {
        printf("%c",c);
    }
}

int priority( char c)//判断符号的优先级 +、-返回1  *、/返回2
{
    int ret = 0;
    if('+' == c || '-' == c)
    {
        ret = 1;   
    }
    else if('*'  == c ||  '/' == c)
    {
        ret = 2;   
    }
   
    return ret;
}

int isLeft( char c)//判断是否为左括号
{
    int ret = 0;
    if('(' == c)
    {
        ret = 1;   
    }
    return ret;
}

int isRight( char c)//判断是否为右括号
{
    int ret = 0;
    if(')' == c)
    {
        ret = 1;   
    }
   
    return ret;
}

void transform(   char * c)//中缀转后缀
{
    LinkStack* stack = LinkStack_Create();//用于存放运算符的栈
    int i = 0;//
    while(c[i] != '\0')
    {
        if( isNum(c[i]) )//如果是数字直接输出
        {
            output(c[i]);   
        }
        else if(isOperator(c[i]))//如果是运算符
        {
                if(LinkStack_Size(stack) == 0)//第一次遇见运算符压盏
                {
                    LinkStack_Push(stack,(void*)(c+i));   
                }else
                {
                    while(   priority(  (*(char*)LinkStack_Top(stack) ) )  >= priority(c[i]))//如果栈顶运算符优先级大于或等于当前运算符出栈并且输出
                    {
                        if(LinkStack_Size(stack) != 0)
                        {
                        
                          output( *(char*)LinkStack_Pop(stack) );
                          
                        }   
                    }
                    LinkStack_Push(stack,(void*)(c+i));//栈为空或者栈里优先级都小于当前运算符,压盏
                }
        }else if(isLeft(c[i]))//如果是左括号 压栈
        {
            LinkStack_Push(stack,(void*)(c+i));   
        }else if(isRight(c[i]))//如果是右括号,在栈顶不为左括号时,弹出全部运算符
        {
                while( !isLeft(  (  *(char*)LinkStack_Top(stack)) )   )
                {
                      printf("%c", *(char*)LinkStack_Pop(stack));   
                    
                }
                LinkStack_Pop(stack);//弹出左括号
        }   
        i++;
    }
   
    if(c[i] == '\0')//遍历完整个字符串时,栈中符号全部出栈
    {
            while(LinkStack_Size(stack))
            {
                output( *(char*)LinkStack_Pop(stack));   
            }
    }
    LinkStack_Destroy(stack);
}

int main(int argc, char *argv[]) {

    char c[] = "3+2(4-5*6)+7/8";
    transform(c);


栈是看教程跟着写的,现在遇见的问题是   priority(  (*(char*)LinkStack_Top(stack) ) )  >= priority(c[i] ) 判断优先级这里如果加上=号就会运行时错误,不加没问题。请问各位大牛,问题到底出在哪?  我看的教程上面是把char转换成指针类型储存的,我改了,也不会出错,也就是这个样子LinkStack_Push(stack,(void*)(int)c[i],难道只能这么存么?存数组的地址进去就不行吗?菜鸟求助
2016-01-27 22:18
快速回复:中缀表达式转后缀表达式的问题
数据加载中...
 
   



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

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