//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;
}
运行结果: