| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 545 人关注过本帖
标题:中缀转换为后缀问题——高手帮忙找找错误!谢谢了!
只看楼主 加入收藏
xuru1990
Rank: 2
等 级:论坛游民
帖 子:36
专家分:23
注 册:2009-10-28
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:6 
中缀转换为后缀问题——高手帮忙找找错误!谢谢了!
/*stack.h*/
static char prio[7][7] =
{
    '>','>','<','<','<','>','>',
        '>','>','<','<','<','>','>',
        '>','>','>','>','<','>','>',
        '>','>','>','>','<','>','>',   
        '<','<','<','<','<','=',' ',
        '>','>','>','>',' ','>','>',
        '<','<','<','<','<',' ', '='   
};
#include "iostream.h"
#include "stdlib.h"

#define  stack_size   100
#define  ok  1
#define  False 0
typedef char etype;

typedef int status;
typedef struct
{  
    char * base;
    int top;
    int st_size;
}sqstack;

status init_stack(sqstack & s);  
status get_e(sqstack s,etype &e);   
status push(sqstack & s,etype e);   
status out_e(sqstack & s,etype & e);  
void display(sqstack s);

int adj_operator(etype e);                   //判断是否是操作符
void mid_chang_back(etype * mid, etype * back);           //中缀转换为后缀
char comp_turns(char ch1,char ch2);    //判断优先级
/*stack.cpp*/
#include "stack.h"
 status init_stack( sqstack & s)//初始化函数
 {
     s.base=new etype[stack_size];
     if(!s.base) return False;
     s.top=-1;
     s.st_size=stack_size;
     return ok;
 }
 
status get_e(sqstack s,etype &e)//获得e
 {
 
 if (s.top==-1) return False;
 e=s.base[s.top];
 return ok;
 
 
 }


status push(sqstack & s,etype e)//进栈
{
    if(s.top>=s.st_size)return False;

    s.top++;
    s.base[s.top]=e;
    return ok;
}


status out_e(sqstack & s,etype & e)//出栈
{
    if(s.top==-1)return False;
e=s.base[s.top];
s.top--;
return ok;
}


void display(sqstack s)//输出栈
{
    while(s.top>=0)
    {
        cout<<s.base[s.top]<<"  ";
        s.top--;

    }

    cout<<endl;   
}









int  adj_operator(char e)//判断是否是符号
{

    char p[]={'+','-','*','/','(',')','#'};
    for(int i=0;i<7;i++)
        if(e==p[i])return i+1;
        return 0;
}
char comp_turns(char ch1,char ch2 )//判断优先级

{
    return prio[adj_operator(ch1)-1][adj_operator(ch2)-1];

}


从这里开始-》这个中缀转换为后缀的函数有什么错误么    
void mid_chang_back(etype * mid,etype * back)//中缀转换为后缀
{
    sqstack s;
    init_stack(s);
    push(s,'#');

    etype ch='a';
    etype *p=back;
    while(*mid!='#'||ch!='#')
    {
        if(!adj_operator(*mid))*p++=*mid++;
        
        else
       {
            get_e(s,ch);

            if(comp_turns(*mid,ch)=='>')//比栈顶高或等
        
            {
                push(s,*mid++);
            }
           if(comp_turns(*mid,ch)=='<')
            {
            
                while(comp_turns(*mid,ch)=='<')//比栈顶优先级低
                {
                    out_e(s,ch);
                    *p++=ch;
                }
            
                push(s,*mid);
                           
         }   
        

          if(comp_turns(*mid,ch)=='=')
   
            {
   
                out_e(s,ch);mid++;
   
   
            }
       }
   

   
    }
}   






搜索更多相关主题的帖子: 后缀 
2010-04-07 12:45
xuru1990
Rank: 2
等 级:论坛游民
帖 子:36
专家分:23
注 册:2009-10-28
收藏
得分:0 
  while(*mid!='#'||ch!='#')
    {
        if(!adj_operator(*mid))*p++=*mid++;
        
        else
       {
            get_e(s,ch);

            if(comp_turns(*mid,ch)=='>')//比栈顶高或等
        
            {
                push(s,*mid++);
            }
           if(comp_turns(*mid,ch)=='<')
            {
            
                while(comp_turns(*mid,ch)=='<')//比栈顶优先级低
                {
                    out_e(s,ch);
                    *p++=ch;
                }
            
                push(s,*mid);
                           
         }   
        

          if(comp_turns(*mid,ch)=='=')
   
            {
   
                out_e(s,ch);mid++;
   
   
            }
       }
   

   
    }
}   
这个while循环是不是有问题啊!
2010-04-07 16:03
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
能不能随便输入数据 (位数大于1的)?
2010-04-07 18:12
xuru1990
Rank: 2
等 级:论坛游民
帖 子:36
专家分:23
注 册:2009-10-28
收藏
得分:0 
可以的,如:12,是当成两个字符来处理的,
这里没有计算,只有转换
2010-04-08 12:22
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
以下是引用xuru1990在2010-4-7 16:03:48的发言:

  while(*mid!='#'||ch!='#')
    {

        if(!adj_operator(*mid))*p++=*mid++;
        
        else
       {
            get_e(s,ch);

            if(comp_turns(*mid,ch)=='>')//比栈顶高或等
        
            {
                push(s,*mid++);
            }
           if(comp_turns(*mid,ch)=='<')
            {
            
                while(comp_turns(*mid,ch)=='<')//比栈顶优先级低
                {
                    out_e(s,ch);
                    *p++=ch;
                }
            
                push(s,*mid);
                           
         }   
        

          if(comp_turns(*mid,ch)=='=')
   
            {
   
                out_e(s,ch);mid++;
   
   
            }
       }
   

   
    }
}   
这个while循环是不是有问题啊!
判断结束的标志为 栈空

当栈里面是‘#’,‘(’,‘+’ 然后欲进栈的字符为‘)’
 运行完之后栈里面就为‘#’,‘(’,‘)’ 这是错误的

最后在后缀表达式 末了 加上 结束标志
2010-04-10 12:10
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:20 
/*#include "iostream"
#include "stdlib.h"
using namespace std;*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define  stack_size   100
#define  ok  1
#define  False 0
typedef char etype;

typedef int status;
typedef struct
{  
    char *base;
    char *top;
    int st_size;
}sqstack;

char prio[7][7] = //第一个下标表示在栈外  第二个下标表示栈内的
{
        '>','>','<','<','<','>','>',
        '>','>','<','<','<','>','>',
        '>','>','>','>','<','>','>',
        '>','>','>','>','<','>','>',   
        '<','<','<','<','<','=',' ',
        '>','>','>','>',' ','>','>',
        '<','<','<','<','<',' ','='   
};

status init_stack(sqstack &s);  
status get_e(sqstack s,etype &e);   
status push(sqstack & s,etype e);   
status pop(sqstack & s,etype &e);  
void display(sqstack s);
int adj_operator(etype e);                   //判断是否是操作符
void mid_chang_back(etype * mid, etype * back);           //中缀转换为后缀
char comp_turns(char ch1,char ch2);    //判断优先级

int main()
{
    char mid[100], back[100];
    printf("输入前缀表达式:");
    gets(mid);
    printf("\n");
    printf("输出前缀表达式:");
    puts(mid);
    mid_chang_back( mid, back);
    printf("输出后缀表达式:");
    puts(back);
    return 0;
}


status init_stack( sqstack & s)//初始化函数
{
     s.base = new etype[stack_size];
     if(!s.base) return False;
     s.top = s.base;
     s.st_size = stack_size;
     return ok;
}

status get_e(sqstack s,etype &e)//获得e 栈顶元素
{
    if ( s.top == s.base ) return False;
    e = *(s.top-1);
    return ok;
}


status push(sqstack & s,etype e)//进栈
{
    if(s.top-s.base >= s.st_size )return False;

    *s.top++ = e;
    return ok;
}

status pop(sqstack & s,etype & e)//出栈
{
    if(s.top==s.base)return False;
    e=*--s.top;
    return ok;
}

void display(sqstack s)//输出栈
{
    while(s.top != s.base)
    {
        printf("%c ", *s.top);
        //cout<<s.base[s.top]<<"  ";
        s.top--;

    }
    //cout<<endl;  
    printf("\n");
}

int  adj_operator(char e)//判断是否是符号
{

    char p[]={'+','-','*','/','(',')','#'};
    for(int i=0;i<7;i++)
        if(e==p[i])return i+1;
        return 0;
}
char comp_turns(char ch1,char ch2 )//判断优先级

{
    return prio[adj_operator(ch1)-1][adj_operator(ch2)-1];

}

//从这里开始-》这个中缀转换为后缀的函数有什么错误么    
void mid_chang_back(etype * mid,etype *back)//中缀转换为后缀
{
    sqstack s;
    init_stack(s);
    push(s,'#');

    int i=0;
    etype ch = 'a';
    //etype *p=back;
    //while(*mid!='#'||ch!='#')
    while( s.top != s.base )
    {
        if(!adj_operator(*mid))//不是运算符
        {
            back[i++]=*mid++;
        }
        else//是运算符
        {
            get_e(s,ch);
            if(comp_turns(*mid,ch)=='>')//比栈顶高或等
            {
                push(s,*mid++);
            }
            else if(comp_turns(*mid,ch)=='<')
            {
                while(comp_turns(*mid,ch)=='<')//比栈顶优先级低
                {
                    pop(s,ch);
                    back[i++] = ch;
                    get_e(s, ch);
                }
                if(comp_turns(*mid,ch)=='=')
                {
                    pop(s,ch);
                    mid++;  
                }
                //push(s,*mid);
                else
                    push(s,*mid++);
           }   
           else if(comp_turns(*mid,ch)=='=')
           {
                pop(s,ch);
                mid++;  
           }
       }
    }
    back[i++] = '\0';
}

程序的层次还不过细  有些情况没有考虑
当有括号输入 就不能工作了  自己改进下
2010-04-10 12:14
xuru1990
Rank: 2
等 级:论坛游民
帖 子:36
专家分:23
注 册:2009-10-28
收藏
得分:0 
非常感谢,应该就是这里了
2010-04-10 22:24
快速回复:中缀转换为后缀问题——高手帮忙找找错误!谢谢了!
数据加载中...
 
   



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

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