棧的操作——輸出超限問題
這個題本來以為挺簡單的,結果錯了三次。。。
##原本錯誤的程式碼
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define maxsize 1008
#define error 1
#define ok 0
typedef int Status;
typedef int ElemType;
typedef struct
{
ElemType *space;
int top;
}Stack;
Status Initstack(Stack *S)
{
S->space=(ElemType *)malloc(sizeof(ElemType)*maxsize);
if(!S->space)
return error;
S->top=-1;
return ok;
}
Status push(Stack *S,ElemType e)
{
if(S->top+1==maxsize)
return error;
S->space[++S->top]=e;
return ok;
}
Status pop(Stack *S,int *e)
{
if(S->top==-1)
return error;
*e=S->space[S->top--];
return ok;
}
Status clearstack(Stack *S)
{
S->top=-1;
}
int main()
{
char str[1008];
Stack S;
Initstack(&S);
int e,i;
while(gets(str)){
int num=1;
for(i=0;i<strlen(str);i++) {
switch(str[i]){
case 'P':
push(&S,num);
num++;
//printf("%d",S.top);
break;
case 'Q':
if(pop(&S,&e)==error)
{
printf("error");
break;
}
else
printf("%d ",e);
break;
default:
printf("error");
break;
}
}
printf("\n");
clearstack(&S);
}
}
/*int main()
{
char ch;
Stack S;
Initstack(&S);
int num,e;
ch=getchar();
while(ch!=EOF)
{
num=1;
while(ch!=EOF && ch!='\n')
{
switch(ch){
case 'P':
push(&S,num);
num++;
break;
case 'Q':
if(pop(&S,&e)==error)
{
printf("error");
break;
}
else
printf("%d ",e);
break;
}
ch=getchar();
}
printf("\n");
if(e!=EOF)
{
clearstack(&S);
ch=getchar();
}
}
}*/
##主函式寫了兩種都不對
後來在老師的幫助下,發現在輸出為error時應該退出,再讀取下一段序列,而我的依舊會執行繼續輸出。故輸出超限:多輸出了東西
##更正主函式程式碼
int main()
{
char str[1008];
Stack S;
Initstack(&S);
int num,e,i;
while(gets(str)){
int num=1,tag=1;
for(i=0;i<strlen(str);i++) {
switch(str[i]){
case 'P':
push(&S,num);
num++;
//printf("%d",S.top);
break;
case 'Q':
if(pop(&S,&e)==error)
{
printf("error");
tag=0;
break;
}
else
printf("%d ",e);
break;
default:
printf("error");
break;
}
if(tag==0)
break;
}
printf("\n");
clearstack(&S);
}
}
成功AC