1. 程式人生 > >棧的操作——輸出超限問題

棧的操作——輸出超限問題

這個題本來以為挺簡單的,結果錯了三次。。。

##原本錯誤的程式碼

#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