C用栈实现中缀表达式转后缀表达式
2010-12-11 14:57
267 查看
#include <Stdio.h>
#include <Conio.h>
#include <Stdlib.h>
#define Maxsize 100 /*设顺序表的最大长度为100,可依具体情况分配空间*/
typedef char datatype;
typedef struct
{
datatype data[Maxsize];
int top;/*栈顶指针*/
}SeqStack;/* 顺序栈类型定义 */
/* 构造一个空栈 */
SeqStack *InitStack()
{
SeqStack *s;/* s为顺序栈类型变量的指针*/
s=(SeqStack *)malloc(sizeof(SeqStack));
if(!s)
{
printf("空间不足/n");
return NULL;
}
else
{
s->top=-1;
return s;
}
}
/* 取栈顶元素 */
datatype GetTop(SeqStack *s)
{
if(s->top == -1)
{
printf("/n栈是空的!");
return 0;
}
else
return s->data[s->top];
}
/* 入栈 */
SeqStack *Push(SeqStack *s,datatype x)
{
if(s->top == Maxsize-1 )
{
printf("/n栈是满的!");
return NULL;
}
else
{
s->top++;
s->data[s->top]=x;
return s;
}
}
/* 出栈 */
datatype Pop(SeqStack *s)
{
if(s->top == -1)
{
//printf("/n栈已经空了!");
return 0;
}
s->top--;
return s->data[s->top+1];
}
/* 判别空栈 */
datatype SeqStackEmpty(SeqStack *s)
{
if(s->top ==-1)
{
// printf("此栈是空栈!");
return 1;
}
else
{
// printf("此栈不是空栈!");
return 0;
}
}
void display(SeqStack *p)
{
int t ;
t = p->top;
if(p->top==-1)
{
printf("/n此栈是空的");
}
else
while(t!=-1)
{
printf("%d->",p->data[t]);
t--;
}
}
/* 检测括号是否配对 */
int CheckBracket(char *str)
{
int i=0;
SeqStack *p= InitStack();
datatype ch;
while(str[i])
{
ch=str[i];
if(ch=='(')
{
Push(p,ch); //遇到左括号入栈
}
else
if(ch==')')
{
if(Pop(p)==0) //遇到右括号出栈,如果栈为空,则表达式缺左括号
{
return 0;
}
}
i++;
}
return SeqStackEmpty(p); //栈空则表示配对,栈不为空则表示缺右括号
}
/* 判断优先级 */
char proceed(char left,char right)
{
/* 设定优先矩阵 */
char PriorityMatrix[][8]={
{'0','+','-','*','/','(',')','#'},
{'+','>','>','<','<','<','>','>'},
{'-','>','>','<','<','<','>','>'},
{'*','>','>','>','>','<','>','>'},
{'/','>','>','>','>','<','>','>'},
{'(','<','>','<','<','<','=',' '},
{')','>','<','>','>',' ','>','>'},
{'#','<','<','<','<','<',' ','='}
};
int i,j;
for(i=0;i<8;i++)
if(PriorityMatrix[i][0]==left) break;
for(j=0;j<8;j++)
if(PriorityMatrix[0][j]==right) break;
return PriorityMatrix[i][j];
}
int isNum(char str)
{
char oper[]={'0','1','2','3','4','5','6','7','8','9'};
int temp,i;
for(i=0;i<10;i++)
{ if(oper[i]==str)
return 1;
}
return 0;
}
void post(char r[])
{
char temp,str;
int j=0;
SeqStack *s;
s=InitStack();
Push(s,'#');
str=r[j];
while(!(str=='#' && GetTop(s)=='#'))
{
if(isNum(str))
{
printf("%c",str);
str=r[++j];
}
else
if(proceed(GetTop(s),str)=='<')
{
Push(s,str);
str=r[++j];
}
else
if(proceed(GetTop(s),str)=='>')
{
temp=Pop(s);
printf("%c",temp);
}
else
if(proceed(GetTop(s),str)=='=' &&
GetTop(s)=='(' && str==')')
{
temp=Pop(s);
str=r[++j];
}
}
}
int main(void)
{
/* 此处添加你自己的代码 */
char str[]="3+1*(2+4)#";
printf("%s/n",str); //打印前缀
if(CheckBracket(str)==1) //判断括号是否配对
{
post(str); //处理成后缀并打印出来
}
else
{
printf("Brackets are not matched");
}
printf("/n");
system("pause");
return 0;
}
#include <Conio.h>
#include <Stdlib.h>
#define Maxsize 100 /*设顺序表的最大长度为100,可依具体情况分配空间*/
typedef char datatype;
typedef struct
{
datatype data[Maxsize];
int top;/*栈顶指针*/
}SeqStack;/* 顺序栈类型定义 */
/* 构造一个空栈 */
SeqStack *InitStack()
{
SeqStack *s;/* s为顺序栈类型变量的指针*/
s=(SeqStack *)malloc(sizeof(SeqStack));
if(!s)
{
printf("空间不足/n");
return NULL;
}
else
{
s->top=-1;
return s;
}
}
/* 取栈顶元素 */
datatype GetTop(SeqStack *s)
{
if(s->top == -1)
{
printf("/n栈是空的!");
return 0;
}
else
return s->data[s->top];
}
/* 入栈 */
SeqStack *Push(SeqStack *s,datatype x)
{
if(s->top == Maxsize-1 )
{
printf("/n栈是满的!");
return NULL;
}
else
{
s->top++;
s->data[s->top]=x;
return s;
}
}
/* 出栈 */
datatype Pop(SeqStack *s)
{
if(s->top == -1)
{
//printf("/n栈已经空了!");
return 0;
}
s->top--;
return s->data[s->top+1];
}
/* 判别空栈 */
datatype SeqStackEmpty(SeqStack *s)
{
if(s->top ==-1)
{
// printf("此栈是空栈!");
return 1;
}
else
{
// printf("此栈不是空栈!");
return 0;
}
}
void display(SeqStack *p)
{
int t ;
t = p->top;
if(p->top==-1)
{
printf("/n此栈是空的");
}
else
while(t!=-1)
{
printf("%d->",p->data[t]);
t--;
}
}
/* 检测括号是否配对 */
int CheckBracket(char *str)
{
int i=0;
SeqStack *p= InitStack();
datatype ch;
while(str[i])
{
ch=str[i];
if(ch=='(')
{
Push(p,ch); //遇到左括号入栈
}
else
if(ch==')')
{
if(Pop(p)==0) //遇到右括号出栈,如果栈为空,则表达式缺左括号
{
return 0;
}
}
i++;
}
return SeqStackEmpty(p); //栈空则表示配对,栈不为空则表示缺右括号
}
/* 判断优先级 */
char proceed(char left,char right)
{
/* 设定优先矩阵 */
char PriorityMatrix[][8]={
{'0','+','-','*','/','(',')','#'},
{'+','>','>','<','<','<','>','>'},
{'-','>','>','<','<','<','>','>'},
{'*','>','>','>','>','<','>','>'},
{'/','>','>','>','>','<','>','>'},
{'(','<','>','<','<','<','=',' '},
{')','>','<','>','>',' ','>','>'},
{'#','<','<','<','<','<',' ','='}
};
int i,j;
for(i=0;i<8;i++)
if(PriorityMatrix[i][0]==left) break;
for(j=0;j<8;j++)
if(PriorityMatrix[0][j]==right) break;
return PriorityMatrix[i][j];
}
int isNum(char str)
{
char oper[]={'0','1','2','3','4','5','6','7','8','9'};
int temp,i;
for(i=0;i<10;i++)
{ if(oper[i]==str)
return 1;
}
return 0;
}
void post(char r[])
{
char temp,str;
int j=0;
SeqStack *s;
s=InitStack();
Push(s,'#');
str=r[j];
while(!(str=='#' && GetTop(s)=='#'))
{
if(isNum(str))
{
printf("%c",str);
str=r[++j];
}
else
if(proceed(GetTop(s),str)=='<')
{
Push(s,str);
str=r[++j];
}
else
if(proceed(GetTop(s),str)=='>')
{
temp=Pop(s);
printf("%c",temp);
}
else
if(proceed(GetTop(s),str)=='=' &&
GetTop(s)=='(' && str==')')
{
temp=Pop(s);
str=r[++j];
}
}
}
int main(void)
{
/* 此处添加你自己的代码 */
char str[]="3+1*(2+4)#";
printf("%s/n",str); //打印前缀
if(CheckBracket(str)==1) //判断括号是否配对
{
post(str); //处理成后缀并打印出来
}
else
{
printf("Brackets are not matched");
}
printf("/n");
system("pause");
return 0;
}
相关文章推荐
- 中缀表达式转换为后缀表达式 简易实现(c++)(简易表达式计算)
- 中缀表达式转换为前缀及后缀表达式并求值(java实现)
- 数据结构Java实现06----中缀表达式转换为后缀表达式
- 利用栈实现中缀表达式转后缀表达式
- 【算法】中缀表达式、后缀表达式的java实现几网上观点的勘误。
- 数据结构(C++实现):栈的运用--中缀表达式转换为后缀表达式既 nyoj 257
- 【java】中缀表达式转后缀表达式 java实现
- 关于中缀表达式转后缀表达式 然后求值问题的实现
- java实现中缀表达式转后缀表达式并且计算
- Java堆栈的应用2----------中缀表达式转为后缀表达式的计算Java实现
- 简单计算器实现-中缀表达式转后缀表达式求值
- 中缀表达式算法实现&中缀表达式转后缀表达式
- 中缀表达式转成后缀表达式 C实现
- java实现中缀表达式转后缀表达式并且计算
- C语言实现括号匹配,中缀表达式转后缀表达式并计算的算法
- C语言利用栈实现将中缀表达式转换为后缀表达式(即逆波兰式)
- 数据结构实现中缀表达式到后缀表达式,再到计算出结果的代码
- java实现中缀表达式转后缀表达式并且计算
- 堆栈实现中缀表达式转后缀表达式及计算表达式的值
- 实现计算器4则运算算法-中缀表达式转后缀表达式 - 理论