| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1415 人关注过本帖
标题:中缀变后缀表达式求值
只看楼主 加入收藏
lp198911
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2010-11-16
结帖率:0
收藏
已结贴  问题点数:20 回复次数:3 
中缀变后缀表达式求值
#include "stdio.h"
#include "stdlib.h"
#include "conio.h"
#include<iostream.h>
#define NULL 0

/*栈节点类型*/
typedef struct node
{
  char data;
  struct node *next;
 }snode,*slink;
  typedef struct node_post
 {   
  int data;
  struct node_post *next;
 }pnode,*plink;

/*全局变量定义*/
slink top=NULL;
plink ptop=NULL;

/*栈空检测,空时为1*/
int Emptystack()
{
  if(top==NULL)return 1;
  else return 0;
}

/*出栈,返回top中data*/
char Pop()
{
  char e;
  slink p;
  if(top==NULL)return(-1);
  else
  {
    p=top;
    top=top->next;
    e=p->data;
    free(p);
    return e;
  }
}
int Pop_post()
{
  int e;
  plink p;
  if(ptop==NULL)return(-1);
  else
  {
    p=ptop;
    ptop=ptop->next;
    e=p->data;
    //free(p);
    return e;
  }
}
char Gettop()//读栈
{
  char e;
  slink p;
  if(top==NULL)return(-1);
  else
  {
    p=top;
   // top=top->next;
    e=p->data;
    free(p);
    return e;
  }
}

/*进栈*/
void Push(char e)
{
  slink p;
  p=(slink)malloc(sizeof(snode));
  p->data=e;
  p->next=top;
  top=p;
 }
void Push_post(int e)
{
  plink p;
  p=(plink)malloc(sizeof(pnode));
  p->data=e;
  p->next=ptop;
  ptop=p;
}
int  Precede(char a1,char a2)
{
    int m,n;
    char b[8][8]={
    '0','+','-','*','/','(',')','#',
    '+','>','>','<','<','<','>','>',
    '-','>','>','<','<','<','>','>',
    '*','>','>','>','>','<','>','>',
    '/','>','>','>','>','<','>','>',
    '(','<','<','<','<','<','=','x',
    ')','>','>','>','>','x','>','>',
    '#','<','<','<','<','<','x','='};
    for(int i=1;i<=7;i++)
    {
        if(a1==b[0][i])
            m=i;
        if(a2==b[i][0])
            n=i;
    }
    if(b[m][n]=='>')
        return 1;
    else
        return 0;
}

/*中后续转换*/
void mid_post(char mid[],char post[])
{
  int i=0,j=0;
  char c;
  Push('#');
  do
  { c=mid[i++];
    switch(c)
  {
    case '#':
    {
       while(!Emptystack())
        post[j++]=Pop();
    }break;
    case ')':
    { while(Gettop()!='(')
      post[j++]=Pop();
      Pop();
    }break;
    case '+':
    case '-':
    case '*':
    case '/':
    case '(':
    { while(Precede(Gettop(),c))
      post[j++]=Pop();
      Push(c);
    }break;
    default:post[j++]=c;
    }
  }while(c!='#');

}

/*后缀表达式求值*/
void Postcount(char post[])
{ int i=0;
  char x,a,b;
  int z;
  while(post[i]!='#')
  { x=post[i];
    switch(x)
  {
  case '+':b=Pop_post();a=Pop_post();z=a+b;Push_post(z);break;
  case '-':b=Pop_post();a=Pop_post();z=a-b;Push_post(z);break;
  case '*':b=Pop_post();a=Pop_post();z=a*b;Push_post(z);break;
  case '/':b=Pop_post();a=Pop_post();z=a/b;Push_post(z);break;
  default:z=atoi(&x);Push_post(z);
  }
  i++;
  }
  if(ptop!=NULL)printf("The result is: %d",ptop->data);
  else printf("Failure");
}

void main()
{
  char post[255]=" ",mid[255]=" ";
  int j=1;
  do
  {
    printf("please enter expression(\"#\" as end):\n");
    scanf("%s",mid);
    printf("the expression eaual:\n");
    mid_post(mid,post);
    printf("%s\n",post);
    Postcount(post);
    cout<<"input 1 go on!\n input 0 exit!\n";
    cin>>j;
  }while(j);
}
搜索更多相关主题的帖子: 后缀 求值 表达 
2010-11-16 16:24
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:20 
这个怎么操作
写个表达式的样板 上来
2010-11-18 22:49
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define SIZE 80/*栈的空间大小*/

FILE *fin;/*读取信息文件指针*/
char ch;/*定义缓冲区*/
/*
*运算符优先级 表格
*        +  -  *  /  (  )  #
* in 0  3  3  5  5  1 -1  0
*out 0  2  2  4  4  6  1  0
*/
int prio_table[2][8] =/*优先级表格*/
{
    {0, 3, 3, 5, 5, 1, -1, 0},
    {0, 2, 2, 4, 4, 6, 1, 0}
};

/********* 定义操作数栈和操作方法  ***********/
struct dat
{
    int flag;/*0表示整数 1表示浮点数 2表示辅助字符*/
    double da;
};
struct stack
{
    dat data[SIZE];
    int length;
};
/*初始化栈*/
void Create_stack( stack *s )
{
    s->length = 0;
}
/*进栈*/
void Push_stack( stack *s, dat p )
{
    if( s->length >= SIZE )
    {
        printf("\t栈满\n");
        exit(0);
    }
    ++s->length;
    s->data[s->length].da = p.da;
    s->data[s->length].flag = p.flag;
}
/*判断栈是否为空*/
int Is_empty(stack s)
{
    if( s.length == 0 )
        return 1;
    return 0;
}
/*出栈*/
dat Pop_stack( stack *s )
{
    dat i;
    if( Is_empty(*s) )
    {
        printf("\t栈空\n");
        exit(0);
    }
    i.da = s->data[s->length].da;
    i.flag = s->data[s->length].flag;
    --s->length;
    return i;
}
/*获取栈顶信息*/
dat Get_top( stack s )
{
    if( !Is_empty(s) )
        return s.data[s.length];
}
/*************** end *************************/


int Is_assistant_char(char);
void getch();
void deal_math(stack *);
void show_msy(stack);
int do_ae();

int main()
{
    if( !(fin = fopen("D:\\ae.txt","r")) )
    {
        printf("\t无法打开文件\n");
        exit(0);
    }

    do_ae();
    printf("\n\n");
    fclose(fin);
    return 0;
}

/*判断字符是否为辅助字符
*+ - * / ( ) #
*并返回辅助字符在优先级表中的下标值
*/
int Is_assistant_char(char c)
{
    if( c == '+' )
        return 1;
    else if( c == '-' )
        return 2;
    else if( c == '*' )
        return 3;
    else if( c == '/' )
        return 4;
    else if( c == '(' )
        return 5;
    else if( c == ')' )
        return 6;
    else if( c == '#' )
        return 7;
    else
    {
        return 0;
    }
}

/*
*获取文件字符
*/
void getch()
{
    if( EOF != fscanf(fin, "%c", &ch) )
    {
        putchar(ch);
    }        
}

/*
*获取可用字符
*/
void getsym()
{
    getch();
    while( ch==' ' || ch==9 || ch==10 )
    {
        getch();
    }
}

int do_ae()
{
    int i, j;
    dat key;
    /*定义两个栈*/
    stack d_stk;/*操作数栈*/
    stack r_stk;/*操作符栈*/
    Create_stack(&d_stk);
    Create_stack(&r_stk);
    /*压入一个输入结束符进栈*/
    key.da = '#'; key.flag = 2;
    Push_stack(&r_stk, key);

    getsym();
    while( !Is_empty(r_stk) )
    {
        if( Is_assistant_char(ch) )/*判断是否为辅助字符*/
        {//为辅助字符
            key = Get_top(r_stk);/*获取栈顶字符值*/
            j = Is_assistant_char(key.da);/*获取下标值*/
            i = Is_assistant_char(ch);/*获取栈外辅助字符的下标值*/
            if( prio_table[0][j] < prio_table[1][i] )
            {/*栈里面辅助字符优先级低于占外面的*/
                key.da = ch; key.flag = 2;
                Push_stack(&r_stk, key);
                getsym();
            }
            else if( prio_table[0][j] > prio_table[1][i] )
            {
                key = Pop_stack(&r_stk);
                Push_stack(&d_stk, key);
            }
            else if(  prio_table[0][j] == prio_table[1][i] )
            {
                if( ch != '#' )
                {
                    getsym();
                }
                Pop_stack(&r_stk);
            }
        }
        else
        {
            deal_math(&d_stk);
        }
    }
    printf("\n\n");
    show_msy(d_stk);

    return 0;
}
/*
*处理获取的数字
*/
void deal_math(stack *s)
{
    int  i;
    dat i_key;
    i_key.da = 0;
    if( ch-'0' )
    {//最高位为非零
        while( ch != '.' && !Is_assistant_char(ch) )
        {/*表示计算的是正数*/
            i_key.da = i_key.da*10 + ch - '0';
            getsym();
        }
        if( ch == '.' )
        {/*表示录取的是一个带有整数部分的小数*/
            i = 0;
            getsym();
            while( !Is_assistant_char(ch) )
            {
                ++i;
                i_key.da += (ch-'0')*pow(0.1, i);
                getsym();        
            }
            i_key.flag = 1;
            Push_stack(s, i_key);
        }
        else
        {
            i_key.flag = 0;
            Push_stack(s, i_key);
        }
    }
    else
    {
        getsym();
        if( ch == '.' )
        {
            getsym();
            i = 0;
            while( !Is_assistant_char(ch) )
            {
                ++i;
                i_key.da += (ch-'0')*pow(0.1, i);
                getsym();
            }
            i_key.flag = 1;
            Push_stack(s, i_key);
        }
        else
        {
            printf("\t错误!\n");
            exit(0);
        }
    }   
}
/*输出栈的所有信息*/
void show_msy(stack s)
{
    int index = 1;
    while( index <= s.length )
    {
        if( s.data[index].flag == 0 )
            printf(" %d", int(s.data[index].da));
        else if( s.data[index].flag == 1 )
            printf(" %f", s.data[index].da);
        else if( s.data[index].flag == 2 )
            printf(" %c", char(s.data[index].da));
        ++index;
    }
}
2010-11-19 12:13
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册

文件目录:D:\ae.txt
文件内容:
100+(2+3)*4+0.23455+234+5*7-12+9/5*7#
图片附件: 游客没有浏览图片的权限,请 登录注册
2010-11-19 12:18
快速回复:中缀变后缀表达式求值
数据加载中...
 
   



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

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