数据结构实验之栈与队列九:行编辑器 1479

 编写代码时,题目意思狠清晰,但是之前提交好多次都不对,总是第一组数据对,第二组就不行,后来请教别人发现是Init函数初始内存分配不足,导致第二栈因内存不足直接退出,了解后又在sizeof(int)后面加了*sum解决问题。

#include 
#include 
#include 
#define sum 10000
#define add 1000
typedef struct
{
    int *top;
    int *base;
    int size;
}stack;
void Init(stack *s)
{
    s -> base = (int*)malloc(sizeof(int)*sum);//是在Init()这个函数里,分配内存时只给了一个S->base的空间,所以在第二个栈运行时会内存不足直接退出,需要给sum个空间;
    if(!s -> base)
        exit(0);
    s -> top = s -> base;
    s -> size = sum;
}
void Push(stack *s, char e)
{
    if(s -> top - s -> base >= s -> size)
    {
        s -> base = (int*)realloc(s -> base,(s -> size+add)*sizeof(int));
        if(!s -> base)
            exit(0);
        s -> top = s -> base + s -> size;
        s -> size = s -> size + add;
    }
    *(s -> top) = e;
    s -> top++;
}
void Pop(stack *s)
{
    if(s -> top == s -> base)
        return ;
    s -> top--;
}
int Gettop(stack *s)
{
    return *(s -> top--);
}
void show(stack *s)
{
    while(s -> top != s -> base)
    {
        printf("%c",*(s -> base));
        s -> base++;
    }
}
int Empty(stack *s)
{
    if(s -> top == s -> base )
        return 0;
    else
        return 1;
}
void emptystack(stack *s)
{
    s->top = s->base;
}
int main()
{
    char a[251];
    int  l, i;

    while(~scanf("%s",a))
    {
        stack s;
        Init(&s);
        l = strlen(a);
        for(i =0 ; i < l; i++)
        {
            if(a[i] !='#' && a[i] != '@')
                Push(&s,a[i]);
            else
                if(a[i] == '#')
            {
                if(Empty(&s) == 1)
                Pop(&s);
            }
            else
                if(a[i] == '@')
            {
                emptystack(&s);//用s -> top = s -> base把栈清空
            }
        }
        show(&s);
        printf("\n");
    }
    return 0;
}

 

你可能感兴趣的:(数据结构实验之栈与队列九:行编辑器 1479)