码迷,mamicode.com
首页 > 其他好文 > 详细

【数据结构】栈

时间:2016-06-17 00:51:06      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:

1. 栈的定义

(1) 栈的定义

  栈(stack)是限定仅在表尾进行插入和删除操作的线性表。

(2) 抽象数据类型

ADT 栈(stack)
Data
  同线性表。元素具有相同的类型,相邻元素具有前驱和后继关系。
Operation
  initStack(&S):初始化操作,建立一个空栈S。
  destoryStack(&S):若栈存在,则销毁它。
  clearStack(&S):将栈清空。
  stackEmpty(S):若栈为空,返回true,否则返回false。
  getTop(S, &e):若栈存在且非空,用e返回S的栈顶元素。
  push(&S, e):若栈S存在,插入新元素e到栈S中并成为栈顶元素。
  pop(&S, &e):删除栈S中栈顶元素,并用e返回其值。
  stackLength(S):返回栈S的元素个数。
endADT

2. 栈的顺序存储结构及实现

(1) 栈的顺序存储结构

#define STACK_INIT_SIZE 100  // 存储空间初始分配量 
#define STACKINCREMENT 10    // 存储空间分配增量 

typedef struct 
{
    SElemType *base; // 在栈构造之前和销毁之后,base的值为NULL 
    SElemType *top;  // 栈顶指针 
    int stacksize;   // 当前已分配的存储空间,以元素为单位 
} SqStack; 

(2) 基本操作

初始化一个空栈:

Status initStack(SqStack &S) // 构造一个空栈 
{
    S.base = (SElemType *) malloc (STACK_INIT_SIZE * sizeof(SElemType)); 
    if (!S.base) return ERROR; 
    S.top = S.base; 
    S.stacksize = STACK_INIT_SIZE; 
    return OK; 
} 

取栈顶元素操作:

Status getTop(SqStack S, SElemType &e)
{
    if (S.top == S.base) return ERROR; 
    e = *(S.top - 1); 
    return OK; 
}

进栈操作:

Status push(SqStack &S, SElemType e)
{
    if (S.top - S.base >= S.stacksize)
    {
        S.base = (SElemType *) realloc (S.base, (S.stacksize + STACKINCREMENT) * sizeof(SElemType)); 
        if (!S.base) return ERROR; 
        S.top = S.base + S.stacksize; 
        S.stacksize += STACKINCREMENT; 
    }
    *S.top++ = e; 
    return OK; 
}

出栈操作

Status pop(SqStack &S, SElemType &e)
{
    if (S.top == S.base) return ERROR; 
    e = *(--S.top); 
    return OK; 
}

3. 两栈共享存储空间

  关键思路是:它们是在数组的两端,向中间靠拢。top1和top2是栈1和栈2的栈顶指针,可以想象,只要它们俩不见面,两个栈就可以一直使用。

  事实上,使用这样的数据结构,通常都是当两个栈的空间需求有相反关系时,也就是一个增长时另一个栈在缩短的情况下。否则两个栈都在不停地增长,那很快就会因栈满而溢出了。

  当然,这只是针对两个具有相同数据类型的栈的一个设计上的技巧,如果是不同数据类型的栈,这种办法不但不能更好地处理问题,反而会使问题变得更复杂,大家要注意这个前提。

(1) 空间结构

(2) 进栈、出栈操作

4. 栈的链式存储结构及实现

(1) 栈的链式存储结构

(2) 基本操作

【数据结构】栈

标签:

原文地址:http://www.cnblogs.com/xiaoxxmu/p/5589714.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!