我们实现了可以动态增加栈大小的动态栈
并对realloc 函数的使用方法回顾了一下
一、栈的定义
1.栈是只能访问它的一端来实现数据的储存和检索的一种线性结构,他是一种LIFO(Last In First Out)先进先出的线性表。插入和删除的一端叫做栈顶(TOP),另一端叫做栈底(Botton)。
2.栈的基本操作
1)初始化 init(S) 返回一个空栈
2)判断空
3)入站PUsh
4)出栈Pop
5) 返回栈顶元素
、
3.栈的应用
(1)用于表达式求值,括号匹配,转化递归过程为非递归过程的处理
· ·(2)链式的栈,使用链式结构储存的栈
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
//栈结构体,由栈顶标志 top 和 栈空间组成
//这里是有一片存放int的内存 用*base 指向,应用 base[i] 访问
typedef struct stack{
int *base;
int top;
} Stack;
//给这个空间分配MAX_SIZE*int大小的空间
//初始化 top = 0
void Init(Stack *s){
s->base = (int *)malloc(MAX_SIZE * sizeof(int));
s->top = 0;
}
//实现入栈
void Push(int data, Stack *s){
if(s->top>99){
//当栈满了的时候,使用realloc函数(<stdlib.h> 头文件中)
//为这片空间重新分配一个更大的空间
//realloc(ptr*, size) 会将ptr内存空间中的数据复制到新空间中
//然后将s->base 指向这个新的内存空间
s->base = (int *)realloc(s->base,2*sizeof(int)*MAX_SIZE);
}
//s->base[s->top] 来获得base[i] 的数据
s->base[s->top] = data;
//将标志top加1
s->top++;
}
//实现出栈
//出栈并没有消除出栈的数据,只是下次入栈时会将其覆盖
int Pop(Stack *s){
int data;
if(s->top == 0){
//栈空时提示
printf("the stack is E\n");
return;
}
//这部操作将先将s->top -1 然后再返回
data = s->base[--s->top];
s->top;
return data;
}
int main(){
Stack s;
int i = 0;
Init(&s);
//我们入栈198个数据来检查是否为栈分配了新的内存
for(i;i<198;i++)
Push(i,&s);
for(i=198;i>0;i--){
printf("%d\n",Pop(&s));
}
return 0;
}