软考:数据结构基础——栈
我们实现了可以动态增加栈大小的动态栈
并对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; }