马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define STACKINITSIZE 50
typedef struct
{
char * base;
char * top;
int stacksize;
}sqstack;
void Clearstack(sqstack *s)
{
s->top=s->base;
}
void InitStack(sqstack *s)
{
s->base=(char *)malloc(STACKINITSIZE*sizeof(char));
if(!s->base)
printf("adasa");
s->top=s->base;
}
void Push(sqstack * s,char a)
{
*s->top++=a;
}
void Pop(sqstack *s,char * a)
{
*a=*--s->top;
}
int youxianji(char a)
{
if(a=='^')
return 8;
if(a==')')
return 9;
if(a=='*'||a=='/')
return 7;
if(a=='+'||a=='-')
return 5;
if(a=='(');
return 3;
if(a=='#')
return 1;
}
void function(char *a,sqstack * s,int h)
{
char lin;//临时存放出战数据
*s->top='#';
s->top++; //处理前将‘#’入栈
int i,b;
for(i=0;i<h;i++)
{
b=i;
if(a[b]!='+'&&a[b]!='-'&&a[b]!='*'&&a[b]!='/'&&a[b]!='('&&a[b]!=')'&&a[b]!='#'&&a[b]!='^')
{printf("%c",a[b]);continue;}
if(a[b]=='(')
{ Push(s,a[b]);continue;}
if(a[b]=='#'&&*(s->top-1)!='#')
{
do
{Pop(s,&lin);
printf("%c",lin);
}
while(*(s->top-1)!='#');
break;
}
if(a[b]==')')
{
do
{Pop(s,&lin);
printf("%c",lin);
}
while(*(s->top-1)!='(');
Pop(s,&lin);
continue;
}
/*asdadsd*/ if(youxianji(a[b])>youxianji(*(s->top-1))||a[b]=='#')//若优先级大
Push(s,a[b]);
else
{ do
{Pop(s,&lin);
printf("%c",lin);
}
while(youxianji(*(s->top-1))>=youxianji(a[b])) ;
Push(s,a[b]);
}
}
}
int main()
{
char date[20][STACKINITSIZE];//为什么改大后 无效内存引用
sqstack S1;
InitStack(&S1);
int a,N,i;
scanf("%d",&N);
getchar();
for(i=0;i<N;i++)
{
scanf("%s",date[i]);
a=strlen(date[i]);
function(date[i],&S1,a);
printf("\n");
Clearstack(&S1);
}
for(i=0;i<N;i++)
{
;
}
system("pause");
return(0);
}
从中缀向后缀转换表达式,了简化编程实现,假定变量名均为单个字母,运算符只有+,-,*,/ 和^(指数运算),可以处理圆括号(),并假定输入的算术表达式正确。
要求:使用栈数据结构实现 ,输入的中缀表达式以#号结束
自己测试了多组数据均无错误,可是交上去测试时9例中出现三例内存引用无效,四例正确,这是怎么回事
|