数据结构:栈的顺序存储

来源:互联网 发布:jenkins php svn 编辑:程序博客网 时间:2024/06/05 20:31

一. 栈的概念
栈为一种可以实现“先进后出”的存储结构,凡是对数据的处理具有“后进先出(LIFO)”的特点,都可以用栈这种数据结构来操作。

栈也是一个线性表,也就是说,栈元素具有线性关系,即前驱后继关系。只不过它是一种特殊的受限线性表而已。

栈的特殊之处在于限制了这个线性表的插入和删除的位置,它始终只在栈顶进行。这也就使得:栈底是固定的,最先进栈的只能在栈底。

二 . 栈操作
 栈的插入操作,叫做进栈,也成压栈。类似子弹入弹夹。
 栈的删除操作,叫做出栈,也有的叫做弾栈,退栈。如同弹夹中的子弹出夹。

这里写图片描述

三. 栈的顺序存储
栈的顺序存储结构简称顺序栈,它是运算受限制的顺序表。顺序栈的存储结构是:利用一组地址连续的的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top只是栈顶元素在顺序表中的位置。

/****  SeqStack.h  ****//******************************************//****   初始化一个栈     ****//****   压栈(入栈)操作  ****//****   出栈(弹栈)     ****//****   销毁栈          ****//****   返回栈顶元素     ****//****   输出栈的元素个数  ****//****   判断栈是否为空   ****//****   求栈的长度      ****//******************************************/#pragma once#include <stdio.h>#include <stdlib.h>#define MAXSIZE 1024#define true 1#define false 0typedef int ElemTyPE;typedef struct Stack    {       /****结构体套一级指针****/      ElemTyPE *base;      int StackSize;      int top;    }SeqStack;/**** 初始化一个栈 ****/void CreateStack(SeqStack *stack);/**** 压栈(入栈)操作 ****/int  PushStack(SeqStack *stack,ElemTyPE data);/**** 出栈(弹栈) ****/int PopStack(SeqStack *stack,ElemTyPE *mPtr);/**** 销毁栈 ****/int DestoryStack(SeqStack *stack);/**** 返回栈顶元素 ****/void GetTopStack(SeqStack *stack,ElemTyPE *mPtr);/**** 输出栈的元素个数 ****/void ListStack(SeqStack *stack);/****判断栈是否为空****/int EmptyStack(SeqStack *stack);/****求栈的长度****/int GetLenStack(SeqStack *stack);/****  SeqStack.c  ****/#include "SeqStack.h"/**** 初始化一个栈 ****/void CreateStack(SeqStack *stack)    {     /**** 分配MAXSIZE个SeqStack变量 ****/      stack->base = (ElemTyPE *)malloc (sizeof(ElemTyPE)*MAXSIZE);      stack->top = 0;      stack->StackSize = MAXSIZE;    }/**** 压栈(入栈)操作 ****/int PushStack(SeqStack *stack,ElemTyPE data)    {       /**** 栈满,增加一个存储空间 ****/       if (stack->top >= stack->StackSize)      {        stack->base = (ElemTyPE *)realloc (stack->base,sizeof(ElemTyPE)*(stack->StackSize+1));        if (!stack->base)        {          return false;        }        stack->StackSize++;      }       /**** 插入元素,同时栈顶指针上移 ****/      stack->base[stack->top++]=data;      return true;    }/**** 出栈(弹栈) ****/int PopStack(SeqStack *stack,ElemTyPE *mPtr)    {     if (stack == NULL)     {      return false;     }     *mPtr = stack->base[stack->top--];     return true;    }/**** 销毁栈 ****/int DestoryStack(SeqStack *stack)    {      if (stack == NULL)      {        return true;      }      else           {            free (stack);            stack = NULL;          }      return true;    }/**** 遍历栈 ****/void ListStack(SeqStack *stack)    {      int i;       /**** 若栈为NULL,直接结束 ****/      for (i=stack->top-1;i>=0;i--)      {        printf ("%2d",stack->base[i]);      }      printf ("\n");    }/**** 返回栈顶元素 ****/void GetTopStack(SeqStack *stack,ElemTyPE *mPtr)    {     if (stack == NULL)     {      return;     }     /**** 注意栈顶元素的下标 stack->base[stack->top-1] ****/    *mPtr = stack->base[stack->top-1];    //printf ("top data:%d\n",*mPtr);    return;    }/**** 判断栈是否为空 ****/int EmptyStack(SeqStack *stack)    {      /**** 若栈顶元素为0,说明栈为NULL ****/      if (stack->top == 0)      {       return true;      }      return false;    }/**** 求栈的长度 ****/int GetLenStack(SeqStack *stack)    {      if (stack == NULL)      {       return false;      }      return stack->top;    }/****   main.c   ****/#include "SeqStack.h"int main()    {    SeqStack s1;    ElemTyPE mPtr = 0;    ElemTyPE mPcur = 0;    ElemTyPE mPlen = 0;    int i;    /****初始化一个栈****/    CreateStack(&s1);    for (i=0;i<10;i++)    {      /****压栈(入栈)操作****/      PushStack(&s1,i+1);    }    GetTopStack(&s1,&mPtr);    printf ("top Data: %d\n",mPtr);#if 0    /****出栈(弹栈)****/    PopStack(&s1,&mPcur);    printf ("mPcur = %d\n",mPcur);    ListStack(&s1);    /****销毁栈****/    //DestoryStack(&s1);    /****返回栈顶元素****/#endif    /****输出栈的元素个数****/    ListStack(&s1);    /**** 判断栈是否为空 ****/    if (EmptyStack(&s1))    {       printf ("Empty Stack.\n");    }    else       printf ("Not empty Stack.\n");    /****求栈的长度****/   mPlen=GetLenStack(&s1);   printf ("mPlen = %d\n",mPlen);    system("pause");    return 0;    }
1 0
原创粉丝点击