中缀表达式转换为后缀表达式
2012-04-07 14:19
381 查看
优先级表如下:
操作符 # ( *,/ +,- )
进栈后 0 1 5 3 6
进栈前 0 6 4 2 1
#include "stdio.h"
#include "malloc.h"
#define MAXSIZE 100 //初始分配单元为100
//------------------栈的定义 Stack.h------------------
typedef char DataType;
typedef struct node //栈的表示
{
DataType *base; //栈底指针始终指向栈底的位置
//在栈构造之前和销毁之后,base的值为NULL
DataType *top; //栈顶指针
int stacksize; //当前已分配的存储空间,以元素为单位
}SqStack;
void InitStack(SqStack *st) //初始化栈
{
st->base=(DataType*)malloc(MAXSIZE*sizeof(DataType));
if(!st->base) return; //存储分配失败
st->top=st->base; //设置栈为空
st->stacksize=MAXSIZE;
}
int IsEmpty(SqStack *st){ //判断栈是否为空
if(st->top==st->base)
return 1;
else
return 0;
}
void GetStack(SqStack st,DataType *dataElem){ //获取栈顶元素
if(st.top==st.base){
printf("错误,栈空");
return ;
}
*dataElem=*(st.top-1); //获取栈顶的值返回给参数指针指向的值
}
void PopStack(SqStack *st){ //出栈
if(st->top==st->base){
printf("栈空不能出栈");
return ;
}
st->top=--(st->top); //删除栈顶元素
}
void PushStack(SqStack *st,DataType dataElem){ //进栈
if(st->top-st->base>=st->stacksize){ //栈满不能进栈
printf("栈空不能出栈");
return ;
}
*st->top=dataElem;
st->top++;
}
//--------------------------定义结束---------------------------------
//----------------中缀表示式转为后缀表达式--ZhanHuanHZ.h----------------------
int InPreStack(char c){ //进入栈前的优先级
int i=0;
switch (c)
{
case '#': //#的优先级最低为0
i=0;break;
case '(':
i=6;break;
case '*':
case '/':
i=4;break;
case '+':
case '-':
i=2;break;
case ')':
i=1;break;
default : //否则为操作数,操作数的优先级最低,即
i=-1; //直接输出,不进栈
}
return i;
}
int InAfSatck(char c){ //进栈后的优先级
int i=0;
switch (c)
{
case '#': //#的优先级最低为0
i=0;break;
case '(': //优先级变为1
i=1;break;
case '*': //进栈后的优先级加1
case '/':
i=5;break;
case '+':
case '-':
i=3;break;
case ')': //优先级变为6
i=6;break;
}
return i;
}
void Print_HouXu(char *ch){
char char_out='#';
SqStack s; InitStack(&s);
PushStack(&s,'#'); //#进栈
while(*ch!='#'){ //以输入#字符结束
if(InPreStack(*ch)==-1){ //该字符为操作数,直接输出
printf("%c",*ch);ch++;}
else
{
GetStack(s,&char_out); //获取栈顶的操作符
while(InPreStack(*ch)<InAfSatck(char_out)){ //进栈前操作符的优先级小于进栈后的优先级
printf("%c",char_out); PopStack(&s);
GetStack(s,&char_out); } //则出栈
if(InPreStack(*ch)==InAfSatck(char_out)&&(char_out=='(')){ //如果相等就抵消(),不输出
PopStack(&s);GetStack(s,&char_out);ch++;}
if(InPreStack(*ch)>InAfSatck(char_out)){ //如果大于则进栈
PushStack(&s,*ch); ch++;}
}
}
if(!IsEmpty(&s)&&*ch=='#'){ //输入结束,栈不为空
GetStack(s,&char_out);
while(!IsEmpty(&s)&&char_out!='#'){ //输出栈中的所有内容
printf("%c",char_out); PopStack(&s);
GetStack(s,&char_out);}
}
}
//------------------------结束-------------------------------
///------------主函数测试---------------------------
void main()
{
char ch[]={'a','+','b','*','(','c','-','d',')','-','e','/','f','#','\0'};
printf("%s\n",ch);
printf("输入的一个中缀表达式:\n");
printf("如:a+b*(c-d)-e/f\n");
printf("\n后缀表达式为:\t");
Print_HouXu(ch);
printf("\n正确答案为:\tabcd-*+ef/-\n");
}
//-------------测试结束-----------------------------
操作符 # ( *,/ +,- )
进栈后 0 1 5 3 6
进栈前 0 6 4 2 1
#include "stdio.h"
#include "malloc.h"
#define MAXSIZE 100 //初始分配单元为100
//------------------栈的定义 Stack.h------------------
typedef char DataType;
typedef struct node //栈的表示
{
DataType *base; //栈底指针始终指向栈底的位置
//在栈构造之前和销毁之后,base的值为NULL
DataType *top; //栈顶指针
int stacksize; //当前已分配的存储空间,以元素为单位
}SqStack;
void InitStack(SqStack *st) //初始化栈
{
st->base=(DataType*)malloc(MAXSIZE*sizeof(DataType));
if(!st->base) return; //存储分配失败
st->top=st->base; //设置栈为空
st->stacksize=MAXSIZE;
}
int IsEmpty(SqStack *st){ //判断栈是否为空
if(st->top==st->base)
return 1;
else
return 0;
}
void GetStack(SqStack st,DataType *dataElem){ //获取栈顶元素
if(st.top==st.base){
printf("错误,栈空");
return ;
}
*dataElem=*(st.top-1); //获取栈顶的值返回给参数指针指向的值
}
void PopStack(SqStack *st){ //出栈
if(st->top==st->base){
printf("栈空不能出栈");
return ;
}
st->top=--(st->top); //删除栈顶元素
}
void PushStack(SqStack *st,DataType dataElem){ //进栈
if(st->top-st->base>=st->stacksize){ //栈满不能进栈
printf("栈空不能出栈");
return ;
}
*st->top=dataElem;
st->top++;
}
//--------------------------定义结束---------------------------------
//----------------中缀表示式转为后缀表达式--ZhanHuanHZ.h----------------------
int InPreStack(char c){ //进入栈前的优先级
int i=0;
switch (c)
{
case '#': //#的优先级最低为0
i=0;break;
case '(':
i=6;break;
case '*':
case '/':
i=4;break;
case '+':
case '-':
i=2;break;
case ')':
i=1;break;
default : //否则为操作数,操作数的优先级最低,即
i=-1; //直接输出,不进栈
}
return i;
}
int InAfSatck(char c){ //进栈后的优先级
int i=0;
switch (c)
{
case '#': //#的优先级最低为0
i=0;break;
case '(': //优先级变为1
i=1;break;
case '*': //进栈后的优先级加1
case '/':
i=5;break;
case '+':
case '-':
i=3;break;
case ')': //优先级变为6
i=6;break;
}
return i;
}
void Print_HouXu(char *ch){
char char_out='#';
SqStack s; InitStack(&s);
PushStack(&s,'#'); //#进栈
while(*ch!='#'){ //以输入#字符结束
if(InPreStack(*ch)==-1){ //该字符为操作数,直接输出
printf("%c",*ch);ch++;}
else
{
GetStack(s,&char_out); //获取栈顶的操作符
while(InPreStack(*ch)<InAfSatck(char_out)){ //进栈前操作符的优先级小于进栈后的优先级
printf("%c",char_out); PopStack(&s);
GetStack(s,&char_out); } //则出栈
if(InPreStack(*ch)==InAfSatck(char_out)&&(char_out=='(')){ //如果相等就抵消(),不输出
PopStack(&s);GetStack(s,&char_out);ch++;}
if(InPreStack(*ch)>InAfSatck(char_out)){ //如果大于则进栈
PushStack(&s,*ch); ch++;}
}
}
if(!IsEmpty(&s)&&*ch=='#'){ //输入结束,栈不为空
GetStack(s,&char_out);
while(!IsEmpty(&s)&&char_out!='#'){ //输出栈中的所有内容
printf("%c",char_out); PopStack(&s);
GetStack(s,&char_out);}
}
}
//------------------------结束-------------------------------
///------------主函数测试---------------------------
void main()
{
char ch[]={'a','+','b','*','(','c','-','d',')','-','e','/','f','#','\0'};
printf("%s\n",ch);
printf("输入的一个中缀表达式:\n");
printf("如:a+b*(c-d)-e/f\n");
printf("\n后缀表达式为:\t");
Print_HouXu(ch);
printf("\n正确答案为:\tabcd-*+ef/-\n");
}
//-------------测试结束-----------------------------
相关文章推荐
- 利用栈将中缀表达式转换成后缀表达式
- 将中缀表达式转换成后缀表达式的三种方 法
- 中缀表达式与后缀表达式的转换及后缀表达式的计算
- 利用数组栈将中缀表达式转换成后缀表达式
- 实现中缀表达式到后缀表达式的转换
- 利用栈将中缀表达式转换成后缀表达式
- 中缀表达式转换为前缀及后缀表达式并求值(java实现)
- Java数据结构06----中缀表达式转换为后缀表达式
- 中缀表达式转换为前缀及后缀表达式并求值【摘】
- 栈和队列6|中缀表达式转换为后缀表达式 - 数据结构和算法28
- 中缀表达式转换为后缀表达式--堆栈实现
- 中缀表达式转换为后缀表达式
- ---中缀表达式转换为后缀表达式---模拟计算器-----堆栈
- 中缀表达式与后缀表达式之间的转换
- 利用栈将中缀表达式转换为后缀表达式
- 利用JAVA实现中缀表达式向后缀表达式的转换,并求出表达式的值
- 括号匹配问题 中缀表达式转换为后缀表达式
- 栈运用之——中缀表达式到后缀表达式的转换及运算
- 中缀表达式转换成后缀表达式的规则
- 有关中缀表达式转换成后缀表达式的算法