顺序栈的定义及静态动态实现


一、栈的定义

(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),同时返回新分配的内存区域的首地址。即重新分配存储器块的地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值