数据结构与算法3—栈
创始人
2024-05-11 03:15:18
0

1. 栈的定义

  • 栈,也叫堆栈,是最常用也是最重要的数据结构之一。
  • 栈(Stack)是限定仅在表的一端进行插入或删除操作的线性表,通常称插入、删除的这一端为栈顶(Top),另一端为栈底(Bottom)。当表中没有元素时称为空栈。
  • 栈操作的特点:后进先出,先进后出。
  • 因此,栈称为后进先出表(LIFO, Last In First Out)。

示意图:

2. 栈的基本运算

  • 初始化栈InitStack(*S)
  • 压栈Push(*S,x)    ——在栈顶插入元素
  • 出栈Pop(*S,x)    ——在栈顶删除元素
  • 取栈顶元素GetTop(S,x)
  • 判栈空Empty(S)

栈的几种状态(最大长度MaxSize为4):栈空、压栈、栈满、出栈

3. 栈的存储结构

栈有两种表示方法:顺序存储链式存储

3.1 顺序栈

采用顺序存储结构的栈简称为顺序栈。是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设整型变量top指示栈顶元素在顺序栈中的位置。

// 顺序栈数据类型的C语言描述如下:
#define MaxSize 100
typedef int DataType;
typedef struct {DataType data[MaxSize];int top;
}Stack;// top:栈顶指针。取值范围为0~MaxSize-1。
// top==-1表示栈空,top==MaxSize-1表示栈满。 
// 初始化栈InitStack(S)int InitStack(Stack *S) { S->top=-1; return 1;} // 压栈Push(S,x)
int Push(Stack *S,DataType x)
{if(S->top==MaxSize-1){printf("\n Stack is full!"); return 0;}S->top++;S->data[S->top]=x;return 1; 
}// 判栈空EmptyStack(S)
int EmptyStack(Stack *S)
{ return (S->top==-1?1:0);
}// 出栈Pop(S,x)
int Pop(Stack *S,DataType *x)     
{ if(EmptyStack(S)){   printf("\n Stack is free!"); return 0;}*x=S->data[S->top];//记住要删除的元素值S->top--;return 1;
}// 取栈顶元素GetTopStack(S)
DataType GetTop(STACK *S)   
{  DataType x;if(EmptyStack(S)){   printf("\n Stack is free!"); exit(1);}x=S->data[S->top];return x;
}

3.1 链栈:栈的链式存储结构

链栈结构示意图:

top栈顶指针,惟一的确定一个链栈。 链栈通常带有一个表头结点,所以top->next才指示栈顶元素。

//  链栈的C语言描述如下:
typedef struct node
{ElemType data;struct node *next;
}Stack;

 

Stack * InitStack() 
{Stack *top;top=(Stack *)malloc(sizeof(Stack));top->next=NULL;return top;
}
//进栈
int Push(Stack *top,Pos x) 
{Stack *s;s=(Stack *)malloc(sizeof(Stack));if(!s) //当s==NULL return 0return 0;s->data=x; s->next=top->next; //新申请空间的指针域保存上一个结点的地址top->next=s;  //头指针域保存新结点地址return 1;
}
//判断栈空
int EmptyStack(Stack *top) 
{if(top->next==NULL)return 1;elsereturn 0;
}
//出栈
int Pop(Stack *top,Pos *e) 
{Stack *s;if(EmptyStack(top))return 0;s=top->next;  //取第一个结点的地址*e=s->data;   //返第一结点数据top->next=s->next; //头结点指针域存第二结点地址free(s);return 1;
}//取栈顶元素
int GetTopStack(Stack *top,Pos *e)
{Stack *s;if(EmptyStack(top))return 0;s=top->next;*e=s->data;return 1;
}

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...