数据结构之线性表——栈的顺序存储

来源:互联网 发布:网络食品安全新规 编辑:程序博客网 时间: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
原创粉丝点击