C语言关于栈的学习

知识点1 栈

1 栈的概述

1.1 栈的定义

所谓的栈,也称为堆栈;是特殊的线性表。栈中的数据元素满足线性逻辑关系,只能在线性表的固定操作端进行运算,其它位置不能进行运算。

线性表的其中不能进行操作的固定端,称为栈底;而另外一端可以实现的操作,称为栈顶。

数据在运算过程中,有只能通过栈顶端实现数据的插入、删除、访问。栈的操作特性为:先进后出,后进先出。

1.2 栈的分类

1.

  1. 根据数据的存储方式:

顺序栈:数据采用连续顺序存储空间顺序存储,通过位置表示数据元素之间的逻辑关系

链式栈:数据采用链式存储结构存储,通过数据存储地址表示数据元素之间的逻辑关系。

2.

  1. 在顺序栈中,根据栈顶标签位置数据的有效性:

空栈:栈顶游标指向的是栈顶有效元素的下一个位置;

满栈:栈顶游标指向的时候栈顶有效元素的位置;

3.

  1. 在顺序栈中,根据栈操作地址的递增和递减

递增栈:

递减栈:

2 顺序栈

顺序栈是一个特殊的顺序表,只能通过一端进行访问。

1.

  1. 数据类型定义
    /* 顺序栈数据类型定义 */
    typedef int data_t; 
     
    typedef struct { 
        /* 顺序栈的存储空间:data表示起始元素地址,nmemb表示元素的个数 */ 
        data_t *data; 
        int nmemb; 
        /* 栈顶游标:栈顶元素序号 */ 
        int top; 
    } sqstack_t;
  2. 基本运算实现
    #include <stdlib.h> 
    #include <stdio.h> 
     
    #include "common.h" 
     
    sqstack_t *CreateSqStack(int mynmemb) 
    { 
        sqstack_t *stack; 
    	
        stack = malloc(sizeof(sqstack_t)); 
        if (stack == NULL) 
            return NULL; 
    		
        stack->data = calloc(mynmemb, sizeof(data_t)); 
        if (stack->data == NULL) { 
            free(stack); 
            return NULL; 
        }
        stack->top = -1;
        stack->nmemb = mynmemb; 
    	
        return stack; 
    } 
     
    int PushSqStack(sqstack_t *stack, data_t mydata) 
    { 
        /* 判断栈是否为满 */ 
        if(stack->top == stack->nmemb-1)
            return -1; 
        /* 入栈操作 */ 
        stack->data[++stack->top] = mydata; 
     
        return 0; 
    } 
     
    int GetSqStack(sqstack_t *stack, data_t *mydata) 
    { 
        /* 判断栈是否为空 */ 
        if (stack->top == -1) 
            return -1; 
    		
        *mydata = stack->data[stack->top]; 
        return 0; 
    } 
     
    int PopSqStack(sqstack_t *stack) 
    { 
        /* 判断栈是否为空 */ 
        if (stack->top == -1) 
            return -1; 
        /* 出栈栈顶 */ 
        stack->top--; 
    }

    3 链式栈

    所谓的链式栈,特使的链表;只能在一端进行访问,将链表头结点作为栈顶指针结点,并采用的头部插入和删除实现。

  3. 1栈结点数据类型的定义
    /* 顺序栈数据类型定义 */
    typedef int data_t; 
     
    typedef struct node { 
    	data_t data;		/* 数据域 */ 
     struct node *next; /* 指针域 */ 
    } node_t;

    3.2栈运算实现

    #include <stdlib.h> 
    #include <stdio.h> 
     
    #include "common.h" 
     
    node_t *CreateLinkStack(void) 
    { 
    	node_t *top; 
    	
    	top = malloc(sizeof(node_t)); 
     if (top == NULL) 
    		return NULL; 
    		
    	top->next = NULL; 
    	
     return top; 
    } 
     
    int PushLinkStack(node_t *top, data_t mydata) 
    { 
    	node_t *q; 
     
    	q = malloc(sizeof(node_t)); 
     if (q == NULL) 
    		return -1; 
    	q->data = mydata; 
    	
     /* 入栈操作 */ 
    	q->next = top->next; 
    	top->next = q; 
     
     return 0; 
    } 
     
    int GetLinkStack(node_t *top, data_t *mydata) 
    { 
     /* 判断栈是否为空 */ 
     if (top->next == NULL) 
    		return -1; 
    		
     *mydata = top->next->data; 
     return 0; 
    } 
     
    int PopLinkStack(node_t *top) 
    { 
    	node_t *q; 
    	
     /* 判断栈是否为空 */ 
     if (top->next == NULL) 
    		return -1; 
     /* 出栈栈顶 */ 
    	q = top->next; 
    	top->next = q->next; 
     free(q); 
    	
     return 0; 
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值