数据结构栈及其用法(C语言实现)

来源:互联网 发布:图书编辑 知乎 编辑:程序博客网 时间:2024/06/08 15:34

一、栈的定义

栈是限定仅在表尾进行插入或删除操作的线性表。一次对栈来说,表尾端有其特殊的含义,称为栈顶,相应

的,表头端成为栈底。不含元素的空表称为空栈。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
二、栈的特点

栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据

,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。所以,我们又称栈为后进先出,即 last in first out,简称LIFO结构。它的结构图如下:


三、栈的基本操作

由于栈也是线性表,因此线性表的存储结构对栈也适用,通常栈有顺序栈和链栈两种存储结构,这两种存储结

构的不同,则使得实现栈的基本运算的算法也有所不同。

顺序栈,即栈的顺序存储结构是利用一组连续的存储单元依次存放自栈底到栈顶的数据元素。在顺序栈中有上

溢和下溢的概念。顺序栈就想在一个盒子里放书一样,你要拿书只能从最上面拿,如果书本放到盒子中,超过合资的顶部,那么便是上溢。反正如果没有书了,我们还去拿书,那么便是下溢。

而链栈没有上溢的限制,它只需要在头部进行操作,我们在要存储大量数据元素的时候才会用到链栈,一般情

况都是用顺序栈。因此下面我给出顺序栈的例子:

#include<iostream>#include<cstdio>#include<malloc.h>using namespace std;const int stack_size = 100;const int stackcreament = 10;typedef struct sqstack{    int *base;      //栈底指针    int *top;       //栈顶指针    int stacksize;}sqstack;void initstack(sqstack *s)      //构造一个空栈{    (*s).base = (int *)malloc(sizeof(int) * stack_size);    if(!(*s).base)        exit(0);    (*s).top = (*s).base;    (*s).stacksize = stack_size;}void destory(sqstack &s)        //销毁一个栈{    free(s.base);    s.base = NULL;    s.top = NULL;    s.stacksize = 0;}void clearstack(sqstack &s)     //清空一个栈{    s.top = s.base;}bool emptystack(sqstack &s)     //判断一个栈是否为空{    if(s.top == s.base)        return 1;    return 0;}int lengthstack(sqstack &s)     //返回这个栈的长度{    return s.top - s.base;}int gettop(sqstack &s)          //取栈顶元素{    if(s.base == s.top)        return 0;    return *(s.top-1);}int push(sqstack &s, int data)      //插入新的元素作为栈顶元素{    if(s.top - s.base >= s.stacksize) //栈满,追加空间    {        s.base = (int *)realloc(s.base, (s.stacksize+stackcreament)*sizeof(int));        s.top = s.base + s.stacksize;        s.stacksize += stackcreament;    }    *(s.top) = data;    s.top++;}int pop(sqstack &s)             //删除栈顶元素{    if(s.base == s.top)        return 0;    s.top--;}int main(){    sqstack s;    initstack(&s);    for(int i=0;i<10;i++)        push(s, i);    for(int i=0;i<10;i++)    {        int a = gettop(s);        printf("%d  ", a);        pop(s);    }    printf("\n");    if(emptystack(s) == 1)        printf("不为空\n");    int len = lengthstack(s);    printf("%d\n", len);    destory(s);    return 0;}

栈的几个典型应用的例子:数制的转换, 括号匹配的检查, 行编辑程序等等, 都是利用栈的先进后出特征来进行求解的。

1 0
原创粉丝点击