知识点1 栈
1 栈的概述
1.1 栈的定义
所谓的栈,也称为堆栈;是特殊的线性表。栈中的数据元素满足线性逻辑关系,只能在线性表的固定操作端进行运算,其它位置不能进行运算。
线性表的其中不能进行操作的固定端,称为栈底;而另外一端可以实现的操作,称为栈顶。
数据在运算过程中,有只能通过栈顶端实现数据的插入、删除、访问。栈的操作特性为:先进后出,后进先出。
1.2 栈的分类
1.
- 根据数据的存储方式:
顺序栈:数据采用连续顺序存储空间顺序存储,通过位置表示数据元素之间的逻辑关系
链式栈:数据采用链式存储结构存储,通过数据存储地址表示数据元素之间的逻辑关系。
2.
- 在顺序栈中,根据栈顶标签位置数据的有效性:
空栈:栈顶游标指向的是栈顶有效元素的下一个位置;
满栈:栈顶游标指向的时候栈顶有效元素的位置;
3.
- 在顺序栈中,根据栈操作地址的递增和递减
递增栈:
递减栈:
2 顺序栈
顺序栈是一个特殊的顺序表,只能通过一端进行访问。
1.
- 数据类型定义
/* 顺序栈数据类型定义 */ typedef int data_t; typedef struct { /* 顺序栈的存储空间:data表示起始元素地址,nmemb表示元素的个数 */ data_t *data; int nmemb; /* 栈顶游标:栈顶元素序号 */ int top; } sqstack_t;
- 基本运算实现
#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 链式栈
所谓的链式栈,特使的链表;只能在一端进行访问,将链表头结点作为栈顶指针结点,并采用的头部插入和删除实现。
- 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; }