2.2堆栈

作者: 你weixiao的时候很美 | 来源:发表于2018-11-15 21:57 被阅读1次

1.堆栈:具有一定操作约束的线性表

只在一端(栈顶,Top)做 插入、删除
插入数据:入栈(Push)
删除数据:出栈(Pop)
后入先出:Last In First Out(LIFO)

2.抽象数据描述
类型名称: 堆栈(Stack) 数据对象集:一个有0个或多个元素的有穷线性表。
操作集:长度为MaxSize的堆栈S Stack,堆栈元素item ElementType

1、Stack CreateStack( int MaxSize ): 生成空堆栈,其最大长度为MaxSize;
2、int IsFull( Stack S, int MaxSize ):判断堆栈S是否已满;
3、void Push( Stack S, ElementType item ):将元素item压入堆栈;
4、int IsEmpty ( Stack S ):判断堆栈S是否为空;
5、ElementType Pop( Stack S ):删除并返回栈顶元素;

3.存储实现

//#define MaxSize <储存数据元素的最大个数>
typedef struct {
ElementType Data[MaxSize];
int Top;
} Stack;

//入栈
void Push( Stack *PtrS, ElementType item ) {
if ( PtrS->Top == MaxSize-1 ) {
 printf(“堆栈满”); return;
}else {
PtrS->Data[++(PtrS->Top)] = item; 
return;
}
}

//出栈
ElementType Pop( Stack *PtrS ) {
if ( PtrS->Top == -1 ) {
 printf(“堆栈空”);
return error  ERROR是ElementType的特殊值,标志错误
} else 
 return ( PtrS->Data[(PtrS->Top)--];
}
}
  1. 堆栈的链式存储实现
    栈的链式存储结构实际上就是一个单链表,叫做链栈。插入和删 除操作只能在链栈的栈顶进行

栈顶指针Top应该在链表的头部。

typedef struct Node{ 
ElementType Data;
struct Node *Next;
 } LinkStack;
LinkStack *Top;

//初始化
LinkStack *CreateStack()
{ /* 构建一个堆栈的头结点,返回指针 */
   LinkStack *S;
   S = malloc( sizeof(struct Node ));
   S->Next = NULL;
   return S;
}

//判断是否为空
int IsEmpty( LinkStack *S )
{ /*判断堆栈S是否为空,若为空函数返回整数 1,否则返回0 */
   return ( S->Next == NULL );
}

/入栈
void Push( ElementType item, LinkStack *S ) { /* 将元素item压入堆栈S */
struct Node *TmpCell;
TmpCell = malloc( sizeof( struct Node ) );
TmpCell->Element = item;
TmpCell->Next = S->Next;
S->Next = TmpCell;
}

// 出栈
ElementType Pop( LinkStack *S ) { /* 删除并返回堆栈S的栈顶元素 */
   struct Node *FirstCell;
   ElementType TopElem;
 if( IsEmpty( S ) ) {
printf(“堆栈空”); return NULL; 
} else {
FirstCell = S->Next;
S->Next = FirstCell->Next; 
TopElem = FirstCell ->Element; free(FirstCell);
return TopElem;
} 
}

5.堆栈的应用

算术表达式的运算。
函数的调用, 以及递归实现。
深度优先搜索
回溯算法

相关文章

  • 2.2堆栈

    1.堆栈:具有一定操作约束的线性表 只在一端(栈顶,Top)做 插入、删除插入数据:入栈(Push)删除数据:出栈...

  • Go 堆栈的理解

    在讲Go的堆栈之前,先温习一下堆栈基础知识。 什么是堆栈?在计算机中堆栈的概念分为:数据结构的堆栈和内存分配中堆栈...

  • 三种常见的计算模型

    堆栈机 堆栈机,全称为“堆栈结构机器”,即英文的 “Stack Machine”。基于堆栈机模型实现的计算机,无论...

  • 初识堆栈

    什么是堆栈 引出堆栈 在学习堆栈之前,我们需要从之前寄存器和内存中引出堆栈,我们要思考堆栈有什么必要性?现在假设我...

  • Linux内核——用户堆栈和内核堆栈

    定义 每个进程都有用户堆栈和内核堆栈两个堆栈。进程在用户态时使用用户堆栈,陷入到内核态时便使用内核堆栈。 切换过程...

  • 数据结构和算法(三) - 栈

    堆栈数据结构在概念上与物理的堆栈相同。将元素添加到堆栈时,将其放在堆栈顶部。从堆栈中删除元素时,始终会删除最顶层的...

  • crash之野指针

    例子一 堆栈信息 根据堆栈分析:1,野指针2,有对应的堆栈查看堆栈代码,看那些有可能野指针: 分析所有参数:url...

  • ARM栈结构

    ARM 栈类型 根据栈生长方向,ARM的栈可分为递增堆栈和递减堆栈。 递增堆栈:栈向高地址生长 递减堆栈:栈向低地...

  • 查看JVM信息的命令

    1. jstack 获取线程堆栈信息 打印堆栈信息到标准输出 jstack PID 打印堆栈信息到标准输出,会打印...

  • 20.有效括号

    检测括号对 (),{},[]是否有效。 思路:利用堆栈。遇到左括号压入堆栈,遇到右括号从堆栈弹出并比较。注意(),...

网友评论

      本文标题:2.2堆栈

      本文链接:https://www.haomeiwen.com/subject/sdyufqtx.html