一、栈的定义
栈(stack)是限定仅在表尾进行插入或者删除操作的线性表,通常把表尾叫做栈顶,表头称为栈底,由此可知栈是一个后进先出的线性表,
二、顺序栈的静态存储
代码实现如下:
#include<stdio.h>
typedef struct
{
int a[100];
int top;
}soga;//定义一个空栈
void jinzhan(soga *a)
{
if(a->top==100)
{
printf("数据溢出!");
}//如果a->top到了100则说明已经到达最大存储量再进栈则会溢出
scanf("%d",&a->a[a->top]);
a->top++;
}
void chuzhan(soga *a)
{
if(a->top==-1)
{
printf("数据下溢!");
}
else
{
a->top--;
}
}
int main()
{
soga yoxi;
yoxi.top=0;
int b=111;
while(b!=3)
{
printf("输入1进行进栈操作\n输入2进行出栈操作\n输入3退出");
scanf("%d",&b);
if(b==1)
{
jinzhan(&yoxi);
}
else if(b==2)
{
chuzhan(&yoxi);
}
else
{
break;
}
}
printf("栈内元素为:");
int i=0;
for(i=0;i<yoxi.top;i++)
{
printf("%d ",yoxi.a[i]);
}
return 0;
}
注意
这里的进栈出栈操作都用到了函数,故参数要为一个结构体指针,传的参数为结构体的地址
结构体指针的访问变量方法
1)p->结构体成员;
2)(*p).结构体成员;
3.顺序栈的动态存储
代码如下:
#include<stdio.h>
#include<stdlib.h>
typedef struct soga
{
int *a;
int top;
int daxiao;
}s;
void chushihua(s *b)
{
b->a=(int *)malloc(sizeof(int)*100);
b->top=0;
b->daxiao=100;//初始化栈并分配初始大小为100
}
void jinzhan(s *b)
{
if(b->top>b->daxiao)//判断数据是否溢出
{
int newdaxiao=(int )realloc(b->a,(b->daxiao+100)*sizeof(int));//分配更多空间
free(b->a);//释放原来的空间
b->daxiao+=100;//
}
scanf("%d",&b->a[b->top]);
b->top++;
}
void chuzhan(s *b)
{
if(b->top==0)
{
printf("空栈!");
}
else
{
b->top--;
}
}
int main()
{
s yoxi;
chushihua(&yoxi);
int b=111;
while(b!=3)
{
printf("输入1进行进栈操作\n输入2进行出栈操作\n输入3退出\n");
scanf("%d",&b);
if(b==1)
{
jinzhan(&yoxi);
}
else if(b==2)
{
chuzhan(&yoxi);
}
else
{
break;
}
}
printf("栈内元素为:");
int i=0;
for(i=0;i<yoxi.top;i++)
{
printf("%d ",yoxi.a[i]);
}
}
realloc函数
原型:extern void *realloc(void a, unsigned int newsize);
指针名=(数据类型)realloc(要改变内存大小的指针名,新的大小)。
先判断当前的指针是否有足够的连续空间,如果有,扩大a指向的地址,并且将a返回,如果空间不够,先按照newsize指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来a所指内存区域(注意:原来指针是自动释放,不需要使用free),同时返回新分配的内存区域的首地址。即重新分配存储器块的地址。