|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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例中出现三例内存引用无效,四例正确,这是怎么回事
-
复制代码
|
|