数据结构之线性表——栈的顺序存储
来源:互联网 发布:网络食品安全新规 编辑:程序博客网 时间:2024/06/05 08:11
1 栈的基本概念
栈是一种特殊的线性表,栈仅能在线性表的一段进行操作,即在栈顶进行操作。栈的插入操作叫做进栈,也称压栈,入栈。栈的删除操作,也叫出栈,也叫作弹栈。
需要说明的是,栈也是一个线性表,也就是说栈元素具有线性关系。只不过它是一种特殊的线性表而已。它的特殊之处在于限制了线性表插入和删除的位置,他始终只在栈定进行插入删除操作。这也就使得:栈底是固定的,最先进栈的只能在栈底,只能最后一个出栈。具体描述如下图所示
2栈的常用操作以及具体实现
我们在线性表的基础上完成栈的创建工作,参考《数据结构之线性表——链表的顺序存储(数组描述)》
(1)创建栈
创建栈相当于创建一个顺序存储的线性表
//创建栈相当于创建一个顺序存储的线性表SeqStack * SeqStack_Create(int capacity){return SeqList_Create(capacity);}
(2)销毁栈
销毁栈相当于顺序表的销毁
//销毁栈相当于销毁链表void SeqStack_Destory(SeqStack * stack){return SeqList_Destroy(stack);}
(3)清空栈
清空栈相当于顺序表的清空
//清空栈相当于清空线性表void SeqStack_Clear(SeqStack *stack){return SeqList_Clear(stack);}(4)进栈
进栈相当于在顺序表的尾部插入元素
//栈插入元素相当于在顺序表的尾部插入元素int SeqStack_Push(SeqStack * stack, void *item){return SeqList_Insert(stack,item,SeqList_Length(stack));}
(5)出栈
出栈相当于在顺序表的尾部删除元素
//栈弹出元素相当于从线性表的尾部删除元素void *SeqStack_Pop(SeqStack * stack){return SeqList_Delete(stack, SeqList_Length(stack)-1);}
(6)获取栈顶元素
获取栈顶元素相当于获取顺序表的尾部元素
//获取栈顶元素相当于求链表的尾部元素void *SeqStack_Top(SeqStack * stack){return SeqList_Get(stack,SeqList_Length(stack) - 1);}
(7)获取栈的容量
//求栈的大小相当于求链表的长度int SeqStack_Size(SeqStack * stack){return SeqList_Length(stack);}
(8)栈内数据的大小
//求栈的容量相当于求链表的容量int SeqStack_Capacity(SeqStack *stack){return SeqList_Capacity(stack);}
3 栈的具体实现以及测试案例
#ifndef _MY_SEQSTACK_H_#define _MY_SEQSTACK_H_//顺序栈的设计与实现typedef void SeqStack;SeqStack * SeqStack_Create(int capacity);void SeqStack_Destory(SeqStack * stack);void SeqStack_Clear(SeqStack *stack);int SeqStack_Push(SeqStack * stack, void *item);void *SeqStack_Pop(SeqStack * stack);void *SeqStack_Top(SeqStack * stack);int SeqStack_Size(SeqStack * stack);int SeqStack_Capacity(SeqStack *stack);#endif//_MY_SEQSTACK_H_
//SeqStack.cpp#include"SeqStack.h"#include"SeqList.h"#include<stdio.h>#include <stdlib.h>#include<string.h>//创建栈相当于创建一个顺序存储的线性表SeqStack * SeqStack_Create(int capacity){return SeqList_Create(capacity);}//销毁栈相当于销毁链表void SeqStack_Destory(SeqStack * stack){return SeqList_Destroy(stack);}//清空栈相当于清空线性表void SeqStack_Clear(SeqStack *stack){return SeqList_Clear(stack);}//栈插入元素相当于在顺序表的尾部插入元素int SeqStack_Push(SeqStack * stack, void *item){return SeqList_Insert(stack,item,SeqList_Length(stack));}//栈弹出元素相当于从线性表的尾部删除元素void *SeqStack_Pop(SeqStack * stack){return SeqList_Delete(stack, SeqList_Length(stack)-1);}//获取栈顶元素相当于求链表的尾部元素void *SeqStack_Top(SeqStack * stack){return SeqList_Get(stack,SeqList_Length(stack) - 1);}//求栈的大小相当于求链表的长度int SeqStack_Size(SeqStack * stack){return SeqList_Length(stack);}//求栈的容量相当于求链表的容量int SeqStack_Capacity(SeqStack *stack){return SeqList_Capacity(stack);}
//test.cpp#include"SeqStack.h"#include<stdio.h>#include <stdlib.h>#include<string.h>int main(){int i = 0;SeqStack * stack = NULL;int a[10];for (i = 0; i < 10; i++){a[i] = i + 1;}//创建栈stack = SeqStack_Create(20);//入栈for (i = 0; i < 10; i++){SeqStack_Push(stack, &a[i]);}//栈的属性printf(" len : %d \n", SeqStack_Size(stack));printf("capacity : %d \n", SeqStack_Capacity(stack));printf("top : %d\n", *((int *)SeqStack_Top(stack)));//元素出栈while (SeqStack_Size(stack) > 0){printf("%d ", *((int *)SeqStack_Pop(stack)));}SeqStack_Destory(stack);printf("Hello World!\n");}
0 0
- 数据结构之线性表——栈的顺序存储
- 数据结构之线性表——队列的顺序存储
- 数据结构之线性表的顺序存储
- 数据结构——线性表之顺序存储学习
- 【大话数据结构】——-线性表之顺序存储
- 数据结构——线性表之顺序存储
- 数据结构之线性表—>顺序存储结构
- 数据结构例程——线性表顺序存储的应用
- 数据结构例程——线性表顺序存储的应用
- 数据结构——线性表的顺序存储结构
- 数据结构复习——线性表的顺序存储实现
- Java数据结构——线性表的顺序存储实现
- 数据结构——线性表的顺序存储
- 数据结构之线性表——链表的顺序存储(数组描述)
- 数据结构与算法之——线性表的顺序存储结构
- 数据结构——线性表及线性表顺序存储
- 数据结构之线性表--顺序存储
- 数据结构:线性表之顺序存储结构
- Torch学习资料
- opencv(15)---图像膨胀腐蚀
- 在 Linux 下查看进程运行时间的命令
- Visual Studio for Mac 体验
- POJ 1131 Octal Fractions 笔记
- 数据结构之线性表——栈的顺序存储
- 获取json数据
- Linux下Oracle RAC集群搭建之基本测试与使用(九)
- Linux记录
- sql的执行过程-解析、执行、返回
- NodeJS之单体测试
- 8. String to Integer (atoi) LeetCode题解
- Java中实现多线程关键词整理
- 微信小程序开发