#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;
}