软考:数据结构基础——栈

我们实现了可以动态增加栈大小的动态栈
并对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;
}

  

posted @ 2018-12-01 22:49  Weeeeew  阅读(392)  评论(1编辑  收藏  举报