| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4175 人关注过本帖
标题:学生一枚,求帮助,看看我这个中缀转前缀的程序
只看楼主 加入收藏
向阳的花
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2016-5-7
收藏
 问题点数:0 回复次数:4 
学生一枚,求帮助,看看我这个中缀转前缀的程序
中缀转前缀.zip (1.96 KB)
收到的鲜花
2016-05-07 22:09
向阳的花
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2016-5-7
收藏
得分:0 
如果我写的太乱,大家不想看,求大神分享一个比较好理解的中缀转前缀的程序也行(用顺序栈)
2016-05-07 22:11
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
建议转帖到C++,另外直接贴代码多好,上传一个zip文件让人下载多麻烦,还要解压打开。我帮你复制出来。。。。
程序代码:
#include<iostream>
using namespace std;
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>

#define OK  1
#define OVERFLOW  -2
#define ERROR 0
#define STACK_INIT_SIZE  100
#define STACKINCREMENT 10
typedef char SElemType;
typedef struct
{
    SElemType *top;
    SElemType *base;
    int Stacksize;
}SqStack;
int InitStack(SqStack &S)
{
    S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
    if(!S.base)
    {
        exit(OVERFLOW);
    }
    S.top=S.base;
    S.Stacksize=STACK_INIT_SIZE;
    return OK;
}
int Gettop(SqStack S,SElemType &e)  //除了引用也可以用返回函数值得方式返回e
{//如果栈不空,则返回栈顶元素,并返回OK;
    if(S.base==S.top)
    {
        return ERROR;
    }
    e=*(S.top-1);
    return OK;
}
int push(SqStack &S,SElemType e)
{
    if((S.top-S.base)>=S.Stacksize)    //栈满,追加存储空间
    {
       S.base=(SElemType *)realloc(S.base,(S.Stacksize+STACKINCREMENT)*sizeof(SElemType));
       if(!S.base)
       {
           exit(OVERFLOW);
       }
       S.Stacksize+=S.Stacksize+STACKINCREMENT;
       S.top=S.base+S.Stacksize;
  }
     *(S.top)++=e;
     return OK;
}
int pop(SqStack &S,SElemType &e)
{
    if(S.base==S.top)
    {
        return ERROR;
    }
    e=*(--S.top);
    return OK;
}

int isoperator(SElemType c)//判断是否为操作符,如果是则返回ture.
{
     switch(c)            //也可以用if语句
     {
         case '+':
         case '-':
         case '*':
         case '/':return OK;
         default :return ERROR;
     }
}
int  level(SElemType op)//操作符的优先级初始化
{                       //方便入栈时候的比较
    int level;
    switch(op)
    {
    case '+':
    case '-':level=1;
    case '*':
    case '/':level=2;
    default:level=0;
    return level;
    }
}
string mid_to_pre(string s)   //将一个中缀串转换为后缀串
{
    int i;
    SElemType e,b;
    SqStack pre;
    InitStack(pre);        //建立存放逆序前前缀表达式的栈
    string output="";               //输出串
    for(i=sizeof(s)-1;i>=0;)    //从右向左扫描
    {
        if(s[i]>=48&&s[i]<=57)    //字符之间用ascii码比较
        {
          output=output+s[i];     //假如是操作数则直接进输出串
        }
        if(s[i]==')')  //如果是右括号直接压栈
        {
            push(pre,s[i]);
        }
        while(isoperator(s[i]))//如果是运算符,执行运算符的相关操作
        {
            Gettop(pre,e);//获取栈顶元素
            if(pre.top==pre.base)//如果栈空,运算符直接进栈
            {
               push(pre,s[i]);
            }
            else if(e==')')  //如果栈顶元素为右括号直接入栈
            {
                push(pre,s[i]);
            }
            else if(level(s[i])>=level(e))//如果它的优先级高于或等于栈顶运算符,此运算符入栈
            {
                push(pre,s[i]);
            }
            else
            {   pop(pre,b);
                output=output+b;
            }
        }
        if(s[i]=='(')//假如是左括号,栈中运算符逐个出栈并输出,知道遇到左括号位置,左括号出战
        {
          while(e!=')')
       {
         pop(pre,b);
        output=output+b;
        Gettop(pre,e);
       }
       pop(pre,b);
        }
      i--;   //假如输入还没完毕,跳转到步骤二
    }
    while(pre.base!=pre.top)
    {
        pop(pre,b);
        output=output+b;
    }
    return output;
}
int main()
{
   int i;
    string input,output;
    printf("请输入串:\n");
    cin>>input;
    output=mid_to_pre(input);//中缀转前缀(还差一步逆序,可以在子函数再增设一字符串)
    printf("前缀表达式为:\n");
    for(i=sizeof(output)-1;i>=0;i++)//求串的逆序后才会变成真正的前缀
    {
        printf("%c",output[i]);
    }
    printf("\n");
    return 0;
}


φ(゜▽゜*)♪
2016-06-28 00:13
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
网上有个中缀转后缀的

http://www.

φ(゜▽゜*)♪
2016-06-28 00:14
programfanny
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2007-3-27
收藏
得分:0 
以下是引用书生牛犊在2016-6-28 00:13:12的发言:

建议转帖到C++,另外直接贴代码多好,上传一个zip文件让人下载多麻烦,还要解压打开。我帮你复制出来。。。。
#include<iostream>
using namespace std;
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>

#define OK  1
#define OVERFLOW  -2
#define ERROR 0
#define STACK_INIT_SIZE  100
#define STACKINCREMENT 10
typedef char SElemType;
typedef struct
{
    SElemType *top;
    SElemType *base;
    int Stacksize;
}SqStack;
int InitStack(SqStack &S)
{
    S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
    if(!S.base)
    {
        exit(OVERFLOW);
    }
    S.top=S.base;
    S.Stacksize=STACK_INIT_SIZE;
    return OK;
}
int Gettop(SqStack S,SElemType &e)  //除了引用也可以用返回函数值得方式返回e
{//如果栈不空,则返回栈顶元素,并返回OK;
    if(S.base==S.top)
    {
        return ERROR;
    }
    e=*(S.top-1);
    return OK;
}
int push(SqStack &S,SElemType e)
{
    if((S.top-S.base)>=S.Stacksize)    //栈满,追加存储空间
    {
       S.base=(SElemType *)realloc(S.base,(S.Stacksize+STACKINCREMENT)*sizeof(SElemType));
       if(!S.base)
       {
           exit(OVERFLOW);
       }
       S.Stacksize+=S.Stacksize+STACKINCREMENT;
       S.top=S.base+S.Stacksize;
  }
     *(S.top)++=e;
     return OK;
}
int pop(SqStack &S,SElemType &e)
{
    if(S.base==S.top)
    {
        return ERROR;
    }
    e=*(--S.top);
    return OK;
}

int isoperator(SElemType c)//判断是否为操作符,如果是则返回ture.
{
     switch(c)            //也可以用if语句
     {
         case '+':
         case '-':
         case '*':
         case '/':return OK;
         default :return ERROR;
     }
}
int  level(SElemType op)//操作符的优先级初始化
{                       //方便入栈时候的比较
    int level;
    switch(op)
    {
    case '+':
    case '-':level=1;
    case '*':
    case '/':level=2;
    default:level=0;
    return level;
    }
}
string mid_to_pre(string s)   //将一个中缀串转换为后缀串
{
    int i;
    SElemType e,b;
    SqStack pre;
    InitStack(pre);        //建立存放逆序前前缀表达式的栈
    string output="";               //输出串
    for(i=sizeof(s)-1;i>=0;)    //从右向左扫描
    {
        if(s>=48&&s<=57)    //字符之间用ascii码比较
        {
          output=output+s;     //假如是操作数则直接进输出串
        }
        if(s==')')  //如果是右括号直接压栈
        {
            push(pre,s);
        }
        while(isoperator(s))//如果是运算符,执行运算符的相关操作
        {
            Gettop(pre,e);//获取栈顶元素
            if(pre.top==pre.base)//如果栈空,运算符直接进栈
            {
               push(pre,s);
            }
            else if(e==')')  //如果栈顶元素为右括号直接入栈
            {
                push(pre,s);
            }
            else if(level(s)>=level(e))//如果它的优先级高于或等于栈顶运算符,此运算符入栈
            {
                push(pre,s);
            }
            else
            {   pop(pre,b);
                output=output+b;
            }
        }
        if(s=='(')//假如是左括号,栈中运算符逐个出栈并输出,知道遇到左括号位置,左括号出战
        {
          while(e!=')')
       {
         pop(pre,b);
        output=output+b;
        Gettop(pre,e);
       }
       pop(pre,b);
        }
      i--;   //假如输入还没完毕,跳转到步骤二
    }
    while(pre.base!=pre.top)
    {
        pop(pre,b);
        output=output+b;
    }
    return output;
}
int main()
{
   int i;
    string input,output;
    printf("请输入串:\n");
    cin>>input;
    output=mid_to_pre(input);//中缀转前缀(还差一步逆序,可以在子函数再增设一字符串)
    printf("前缀表达式为:\n");
    for(i=sizeof(output)-1;i>=0;i++)//求串的逆序后才会变成真正的前缀
    {
        printf("%c",output);
    }
    printf("\n");
    return 0;
}

(90) : error C2146: syntax error : missing ';' before identifier 'mid_to_pre'
(90) : error C2501: 'String' : missing storage-class or type specifiers
(90) : fatal error C1004: unexpected end of file found
2016-07-16 14:24
快速回复:学生一枚,求帮助,看看我这个中缀转前缀的程序
数据加载中...
 
   



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

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