中缀表达式转换成后缀表达式
来源:互联网 发布:软件科技公司经营范围 编辑:程序博客网 时间:2024/05/08 23:09
优先级表如下:
操作符 # ( *,/ +,- )
进栈后 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");
}
//-------------测试结束-----------------------------
- 中缀表达式转换成后缀
- 将中缀表达式转换成后缀表达式
- 中缀表达式转换成后缀表达式
- 中缀表达式转换成后缀表达式
- 中缀表达式转换成后缀表达式
- 中缀表达式转换成后缀表达式
- 中缀表达式转换成后缀表达式
- 中缀表达式转换成后缀表达式
- 中缀表达式转换成后缀表达式
- 将中缀表达式转换成后缀表达式
- 中缀表达式转换成后缀表达式
- 中缀表达式转换成后缀表达式 -- 栈
- 表达式 中缀 后缀 转换
- 中缀表达式转换成后缀表达式/计算后缀表达式
- 中缀表达式转换后缀表达式
- 中缀表达式转换后缀表达式
- 中缀表达式转换后缀表达式
- 中缀表达式转换后缀表达式
- 打印杨辉三角形
- JBOSS+EJB3+MYSQL开发
- iPhone消息推送机制实现与探讨 APNS
- minicom 虚拟机配置
- 将 GBK编码的中文 转换成 UTF-8编码的中文
- 中缀表达式转换成后缀表达式
- Facebook CTO妙论移动平台上的Web App与原生应用的合众连横
- Oracle 11g 常用函数(Functions)详解
- Win2003 ftp配置技巧步骤一
- XMLHTTP 对象及其方法(转)
- 两个php错误
- Qt安装及简单配置
- C++11尝鲜:Variadic Function Templates(带变长参数的函数模板)(续)
- Win2003 ftp配置技巧步骤二