栈(一)线性存储栈的c语言实现

一、普通栈的实现,此时可能有大量空间上的浪费

#include
#define maxsize 10
#define false 0
#define ok 1

//定义堆栈的结构
typedef struct sqstack
{
    int top;
    int data[maxsize];
}sqstack;

//建立一个空栈
void creatstack(sqstack *l)
{
    l->top = -1;
}

//进栈push
int pushstack(sqstack *l, int e)
{
    if (l->top == maxsize - 1)
        return false;
    l->top++;
    l->data[l->top] = e;
    return ok;
}


//出栈pop
int popstack(sqstack *l, int *e)
{
    if (l->top == -1)
        return false;
    *e = l->data[l->top];
    l->top--;
    return ok;
}


//显示栈
void seestack(sqstack l)
{
    if (l.top == -1)
        printf("栈是空的");
    while(l.top!=-1)
    {
        printf("%4d",l.data[l.top]);
    l.top--;
    }
}

int main(void)
{
    int a;
    sqstack s;
    creatstack(&s);
    seestack(s);
    pushstack(&s, 5);
    seestack(s);
    pushstack(&s, 3);
    seestack(s);
    popstack(&s, &a);
    seestack(s);
    return 0;
}


二、两栈共享空间

#include
#define maxsize 10
#define false 0
#define ok 1
//定义堆栈的结构
typedef struct sqstack
{
    int top1, top2;
    int data[maxsize];
}sqstack;

//建立一个空栈
void creatstack(sqstack *l)
{
    l->top1 = -1;
    l->top2 = maxsize;
}

//进栈push,i代表进哪个栈,e是进栈的数据
int pushstack(sqstack *l, int i, int e)
{
    if (l->top1 + 1 == l->top2)
        return false;
    if (i == 1)
    {
        l->data[++l->top1] = e;
    }
    else if (i == 2)
    {
        l->data[--l->top2] = e;
    }
    return ok;
}


//出栈pop
int popstack(sqstack *l, int i, int *e)
{
    if (i == -1)
    {
        if (l->top1 == -1)
            return false;
        *e = l->data[l->top1--];
    }
    if (i == 2)
    {
        if (l->top2 == maxsize)
            return false;
        *e = l->data[l->top2++];
    }
    return ok;
}


//显示栈
void seestack(sqstack l, int i)
{
    if (i == 1)
    {
        if (l.top1 == -1)
            printf("栈是空的");
        while(l.top1!=-1)
        {
            printf("%4d",l.data[l.top1--]);
        }
    }
    if (i == 2)
    {
        if (l.top2 == maxsize)
            printf("栈是空的");
        while (l.top2 != maxsize)
        {
            printf("%4d",l.data[l.top2++]);
        }
    }
}

int main(void)
{
    int a,b;
    sqstack s;
    creatstack(&s);
    pushstack(&s, 1, 3);
    seestack(s, 1);
    pushstack(&s,2, 6);
    seestack(s, 2);
    popstack(&s, 2, &a);
    seestack(s, 2);
    return 0;
}

栈的线性存储,第一种普通结构大量浪费空间。第二种两栈共享一个数组,一般用于需求量同一时间相反的两个栈,可以一定程度上节约空间。
进栈操作前判断是否为满栈,出栈前判断是否为空栈。

你可能感兴趣的:(数据结构与算法,c语言,栈)