您的位置:首页 > 其它

NYOJ 467 中缀式变后缀式

2012-08-06 17:16 211 查看
#include<stdio.h>
#include<stdlib.h>
#define Stack_Size 100
#define StackIncrement 10
#define Ok 1
#define Error 0
#define True 1
#define False 0
#define Overflow -2
typedef int status;
//字符栈的操作
typedef struct
{
char *base;
char *top;
int stacksize;
}SqStack;
status InitStack(SqStack &S)
{
S.base=(char *)malloc(Stack_Size*sizeof(char));
if(!S.base)  exit(Overflow);
S.top=S.base;
S.stacksize=Stack_Size;
return Ok;
}
status StackEmpty(SqStack &S)
{
if(S.top==S.base)
return True;
return False;
}
status GetTop(SqStack S,char &e)
{
if(S.top==S.base)  return Error;
e=*(S.top-1);
return Ok;
}
status Push(SqStack &S,char e)
{
if((S.top-S.base)==S.stacksize)
{
S.base=(char *)realloc(S.base,(S.stacksize+StackIncrement)*sizeof(char));
if(!S.base)  exit(Overflow);
S.top=S.base+S.stacksize;
S.stacksize+=StackIncrement;
}
*S.top++=e;
return Ok;
}
status Pop(SqStack &S,char &e)
{
if(S.top==S.base)  return Error;
e=*--S.top;
return Ok;
}
//转化的操作过程
static int i=0;
status Pass(char *s,char c)
{
s[i]=c;
i++;
return Ok;
}
status In(char c)
{
switch(c)
{
case '+':
case '-':
case '*':
case '/':
case '(':
case ')':
case '=':return True;
default :return False;
}
}
int Precede(char t1,char t2)
{
int f=0;
switch(t1)
{ case '+':
case '-':if(!(t2=='('||t2=='*'||t2=='/'))
f=1;
break;
case '*':
case '/':if(t2!='(')
f=1;
break;
case '(':if(t2=='#')
{printf("缺乏左括号\n");
exit(Overflow);}
break;
case ')':if(t2!='(')
f=1;
else
{
printf("括号不匹配\n");
exit(Overflow);
}
}
return f;
}
status Converse(char *s)
{
SqStack OPTR;
char ch,x,c=getchar();
InitStack(OPTR); Push(OPTR,'=');
while(!StackEmpty(OPTR))
{
if(!In(c))
Pass(s,c);
else
switch(c)
{
case '(': Push(OPTR,c);break;
case ')': Pop(OPTR,ch);while(ch!='('){Pass(s,ch);Pop(OPTR,ch);}break;
default :
while(GetTop(OPTR,ch)&&Precede(ch,c))
{
Pass(s,ch);Pop(OPTR,ch);
}
if(c!='=')
Push(OPTR,c);
}
if(c!='=')
{ x=c;c=getchar();
if(!In(x)&&In(c)) Pass(s,' ');
}
else
{
Pop(OPTR,ch);
Pass(s,ch);
}
}
s[i]='\0';
return Ok;
}
//主函数
int main()
{
char s[1010];
int j,n;
scanf("%d",&n);
while(n--){
getchar();
i=0;
Converse(s);
for(j=0;s[j];++j){
putchar(s[j]);
if(In(s[j])) putchar(' ');
}
printf("\n");
}
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: