棧(一)線性儲存棧的c語言實現
阿新 • • 發佈:2019-01-31
一、普通棧的實現,此時可能有大量空間上的浪費
#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;
}
棧的線性儲存,第一種普通結構大量浪費空間。第二種兩棧共享一個數組,一般用於需求量同一時間相反的兩個棧,可以一定程度上節約空間。
進棧操作前判斷是否為滿棧,出棧前判斷是否為空棧。