栈结构

1. 概念    

   典型的栈结构如下图所示:栈结构只能在一端操作,该操作端叫做栈顶,另一端叫做栈底。栈结构按照“后进先出”(Last In First Out, LIFO)的方式处理结点数据。

    

 

                                                                                                 图 1 栈结构

 

    栈结构也包括顺序结构与链式结构两种。

    在栈结构中只有栈顶元素是可以访问的,因此栈结构的操作也比较简单,主要两个即入栈和出栈。

  1#include <unistd.h>
  2#include <string.h>
  3#include <stdlib.h>
  4#include <stdio.h>
  5
  6#define MAX_SIZE    10
  7
  8typedef struct {
  9    int id;
 10    char name[64];
 11    int age;
 12}Student;
 13
 14typedef struct {
 15    Student info[MAX_SIZE+1];  //数据元素
 16    int top;    //栈顶
 17}Stack;
 18
 19//初始化栈
 20Stack *stackInit(void)
 21{
 22    Stack *stk = (Stack *)malloc(sizeof(Stack));
 23    if(NULL == stk){
 24        return NULL;
 25    }
 26    stk->top = 0;
 27    return stk;
 28}
 29
 30//判空栈
 31int stackIsEmpty(Stack *stk)
 32{
 33    return (0 == stk->top);
 34}
 35
 36//判满栈
 37int StackIsFull(Stack *stk)
 38{
 39    return (stk->top >= MAX_SIZE);
 40}
 41
 42//清空栈
 43int stackClear(Stack *stk)
 44{
 45    stk->top = 0;
 46}
 47
 48//释放
 49void StackFree(Stack *stk)
 50{
 51    if (stk)
 52        free(stk);
 53}
 54
 55//入栈
 56int stackPush(Stack *stk, Student data)
 57{
 58    if (stk->top+1 > MAX_SIZE)
 59        return -1;
 60
 61    stk->info[++stk->top] = data;
 62
 63    return 0;
 64}
 65
 66//出栈
 67int stackPop(Stack *stk, Student *data)
 68{
 69    if (stackIsEmpty(stk))
 70        return -1;
 71
 72    *data = stk->info[stk->top--];
 73    return 0;
 74}
 75
 76//读栈顶元素
 77int stackPeek(Stack *stk, Student *data)
 78{
 79    if (stackIsEmpty(stk)) {
 80        fprintf(stderr,"%s","stack is Empty\n");
 81        return -1;
 82    }
 83    *data = stk->info[stk->top];
 84    return 0;
 85}
 86
 87int main()
 88{
 89    Student stu[3] = {
 90        {1, "zhangsan",20},
 91        {2, "lisi",21},
 92        {3, "wangwu",19}
 93    };
 94    Student data = {0};
 95
 96    Stack *stk = stackInit();
 97    if (NULL == stk) {
 98        fprintf(stderr,"%s","stackInit faield\n");
 99        return -1;
100
101    }
102    stackPush(stk, stu[0]);
103    stackPush(stk, stu[1]);
104    stackPush(stk, stu[2]);
105
106    if (!stackPeek(stk, &data))
107        printf("id=%d\tname=%s\tage=%d\n",data.id,data.name,data.age);
108
109    if (!stackPop(stk, &data))
110        printf("id=%d\tname=%s\tage=%d\n",data.id,data.name,data.age);
111
112    if (!stackPeek(stk, &data))
113        printf("id=%d\tname=%s\tage=%d\n",data.id,data.name,data.age);
114
115    stackClear(stk);
116
117    if(stackIsEmpty(stk))
118        fprintf(stderr,"%s","stack is Empty\n");
119    StackFree(stk);
120
121    return 0;
122}

    代码比较简单,主要还是想再复习巩固下数据结构相关概念与知识。希望看到的童鞋,可以自己试着写一下^_^

                                                                         更多文章,欢迎关注公众号交流~

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值