//1,聲明一個指針並且用它申請一段內存
//2,該內存開始于固定的一個端點,只能從另一個端點處一個一個地操作
//3,這樣的數據結構叫做棧
//4,數據出棧時,要先返回棧頂的元素,并刪除棧頂元素,再使棧頂指針退一位
#include<stdio.h>
#include<stdlib.h>
#define STACK_INIT_SIZE 100// 儲存空間初始分配量
#define STACKCREMENT 10//儲存空間分配增量
//定義棧的結構體
typedef struct
{
	int *base;//棧底指針
	int *top;//棧頂指針
	int stacksize;// 當前棧可使用的最大容量
}SqStack;
int InitStack(SqStack *s);
int GetTop(SqStack s,int *e);
int push(SqStack *s,int e);
int pop(SqStack *s,int *e);
//函數功能:主函數
int main()
{
	int i;
	int a[5] = {0};
	SqStack s;//聲明一個名稱為s的棧
	InitStack(&s);//初始化棧s
	/*壓棧s*/
	printf("s的入棧的順序為:");
	for(i = 1;i < 6;i++)
	{
		push(&s,i);
		printf("%d",*s.base++);
	}
	/*出棧s*/
	printf("\ns的出棧的順序為:");
	for(i = 0;i < 5;i++)
	{
	    s.base--;
		pop(&s,&a[i]);
		printf("%d",a[i]);
	}
}
//函數功能:初始化棧
int InitStack(SqStack *s)
{
	s->base = (int *)malloc(STACK_INIT_SIZE * sizeof(int));//申請一百個大小為int的位置
	if(!s->base)exit(0);//如果內存分配失敗就退出程序
	s->top = s->base;//棧頂指針指向棧底指針的位置,即分配內存的頭一個地址
	s->stacksize = STACK_INIT_SIZE;//棧的容量應該當前分配帶的內存量
	return 0;
}
//函數功能:獲取棧頂元素
//int GetTop(SqStack s,int *e)
//{
//	if(s.top == s.base)return 1;//如果空棧,返回1
//	e = *(s.top-1);//棧不空,返回棧頂元素
//	return 0;
//}
//函數功能:增加內存
int push(SqStack *s,int e)
{
	if(s->top - s->base >= s->stacksize)
	{//如果棧滿,追加內存
		s->base = (int *)realloc(s->base,(s->stacksize + STACKCREMENT)*sizeof(int));
		//指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小)
		if(!s->base)exit(0);//分配失敗退出程序
		s->top = s->base + s->stacksize;//棧頂指針指向棧末尾
		s->stacksize += STACKCREMENT;//棧內存容量增加10
	}
	*s->top++ = e;//把e賦值給棧頂元素
	return 0;
}
//函數功能:刪除棧頂元素
int pop(SqStack *s,int *e)
{
	if(s->base == s->top)return 1;
	*e = *--s->top;
	return 0;
}

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值