1. 程式人生 > >棧(一)線性儲存棧的c語言實現

棧(一)線性儲存棧的c語言實現

一、普通棧的實現,此時可能有大量空間上的浪費

#include<stdio.h>
#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<stdio.h>
#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;
}

棧的線性儲存,第一種普通結構大量浪費空間。第二種兩棧共享一個數組,一般用於需求量同一時間相反的兩個棧,可以一定程度上節約空間。
進棧操作前判斷是否為滿棧,出棧前判斷是否為空棧。