一、普通栈的实现,此时可能有大量空间上的浪费
#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;
}
栈的线性存储,第一种普通结构大量浪费空间。第二种两栈共享一个数组,一般用于需求量同一时间相反的两个栈,可以一定程度上节约空间。
进栈操作前判断是否为满栈,出栈前判断是否为空栈。