当前位置:  编程技术>c/c++/嵌入式

浅析顺序结构存储的栈

    来源: 互联网  发布时间:2014-10-23

    本文导语:  栈定义:仅限在表尾进行插入和删除的线性表 栈的特点: 1)一般来说能在表尾进行进栈和出栈的数据 2)先进后出(last in first out ) 3)栈会有栈顶,栈底,通常栈底为高地址,栈顶为高地址,如下图所示 操作系统一般会在...

栈定义:仅限在表尾进行插入和删除的线性表

栈的特点:

1)一般来说能在表尾进行进栈和出栈的数据

2)先进后出(last in first out )

3)栈会有栈顶,栈底,通常栈底为高地址,栈顶为高地址,如下图所示

操作系统一般会在内存划出一块,专门用于栈操作,当然这个跟普通的操作有些区别:比如存放数组,地址是增加的;但是在存入数据到栈,地址则是不断减小的

栈的存储结构:

代码如下:

typedef struct _SQSTACK
{
 SElemType* base;
 SElemType* top;
 int stacksize;
}
SqStack;

数据定义:

代码如下:

//默认的存储空间的大小和空间增长大小
#define STACK_INIT_SIZE 100
#define STACK_INCREMENT 10

//存储数据的类型定义
#ifndef INT_TYPE
#define INT_TYPE
#endif // INT_TYPE

#ifdef INT_TYPE
typedef  int  SElemType;
#elif defined FLOAT_TYPE
typedef  float SElemType;
#elif defined STRING_TYPE
typedef  char* SElemType;
#elif defined STRUCT_TYPE
typedef  void* SElemType;
#endif

栈的操作,会涉及到初始化栈,销毁栈,进栈(入栈),出栈,还有判断栈空,栈大小,以及清空栈,如下:
栈的初始化:

代码如下:

//初始化栈
int InitStack(SqStack *S)
{
 S->base = (SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
 if (!S->base)
 {
  return -1;
 }
 S->top = S->base;
 S->stacksize = STACK_INIT_SIZE;
 return 0;
}

栈才初始化,里面还没有数据,这时候top,base都指向分配空间的基地址,表示栈空
销毁栈:
代码如下:

//销毁栈
int DestroyStack(SqStack *S)
{
 if (S->base)
 {
  free(S->base);
  S->base = NULL;
  S->top = NULL;
  S->stacksize = 0;
 }
 return 0;
}

如果栈存在,就销毁地址空间,将栈尺寸置0
进栈:

代码如下:

int Push(SqStack *S, const SElemType data)
{
 assert(S->base != NULL);
 if (S->top - S->base >= STACK_INIT_SIZE)
 {
  S->base = (SElemType*)realloc(S->base,
   (STACK_INIT_SIZE + STACK_INCREMENT) * sizeof(SElemType));
  if (!S->base)
  {
   return -1;
  }
  S->top = S->base + S->stacksize;
  S->stacksize += STACK_INCREMENT;
 }
 *S->top++ = data;

 return 0;
}

如果栈存在,就销毁地址空间,将栈尺寸置0
进栈:

代码如下:

int Push(SqStack *S, const SElemType data)
{
 assert(S->base != NULL);
 if (S->top - S->base >= STACK_INIT_SIZE)
 {
  S->base = (SElemType*)realloc(S->base,
   (STACK_INIT_SIZE + STACK_INCREMENT) * sizeof(SElemType));
  if (!S->base)
  {
   return -1;
  }
  S->top = S->base + S->stacksize;
  S->stacksize += STACK_INCREMENT;
 }
 *S->top++ = data;

 return 0;
}

如果栈的大小大于已分配长度,重新分配空间,并使栈顶重新指向新的位置,之后就将数据存入当前栈顶指向的位置,然后栈顶+1
出栈:

代码如下:

//出栈
int Pop(SqStack *S, SElemType *data)
{
 assert(S->base != NULL);
 if (S->base == S->top)
 {
  return -1;
 }
 *data = *(--S->top);

 return 0;
}

首先将栈顶位置-1,然后取得当前位置的值
以下为辅助函数,如下:

代码如下:

//栈是否为空
int IsStackEmpty(const SqStack &S)
{
 return ((S.base == S.top) ? true:false);
}

代码如下:

//得到栈的长度
int GetStackLength(const SqStack &S)
{
 assert(S.base != NULL);

 return S.stacksize;
}


代码如下:

//清空栈
int ClearStack(SqStack *S)
{
 assert(S->base != NULL);
 if (S->base != S->top)
 {
  S->top = S->base;
 }
 S->stacksize = 0;

 return 0;
}


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • jquery重复提交请求的原因浅析
  • 浅析删除表的几种方法(delete、drop、truncate)
  • 浅析Oracle中char和varchar2的区别
  • 浅析java中print和println的区别
  • 浅析java class 文件
  • 求教,linux内核代码关于网络部分的浅析
  • 浅析如何在tnsnames.ora中配置监听
  • 浅析ThinkPHP中execute和query方法的区别
  • 浅析C#的复制和克隆
  • 浅析jQuery中调用ajax方法时在不同浏览器中遇到的问题
  • 浅析MySQL之字符串函数
  • 浅析jquery的作用与优势
  • 浅析MySQL之字符串函数 iis7站长之家
  • 浅析c++ 宏 #val 在unicode下的使用
  • 浅析c#中如何在form的webbrowser控件中获得鼠标坐标
  • 浅析SQL语句中GROUP BY的用法
  • PHP强制下载文件方法浅析
  • 浅析打开eclipse出现Incompatible JVM的解决方法
  • C#访问权限修饰符浅析
  • 浅析Java方法传值和传引用问题


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3