栈是限定仅在表的一端进行插入或删除的纯属表,通常称同意插入。删除的一端为栈顶(Top),对应在的。则称还有一端为栈底(Bottom)。

不含元素的栈则称为空栈。

所设栈S={a1,a2,a3,...,an},则称a1为栈底元素,an为栈顶元素。

依据栈的定义可知,栈顶元素总是最后入栈而且最先出栈的。栈底元素总是最先入栈而且最后出栈的。

即栈是按后进先出的原则进行的。

因此,栈又称为后进先出(LIFO)的线性表。

而顺序栈。即栈的顺序存储结构。它是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同一时候附设指针top指示栈顶元素在顺序表中的位置。类似于顺序表,用一维数据描写叙述顺序中的数据元素的存储区域,而栈顶的位置则是随着插入和删除而变化的,通常将用一个整数表示,将数组下标为0的一端设置为栈底。

顺序栈的类型描写叙述:

#define MAXSIZE 100 //栈的最大空间

//顺序栈类型描写叙述
typedef int ElemType;
typedef struct{
ElemType data[MAXSIZE];
int top;
}SqStack;

在顺序栈中。若将数组下标为0的一端设为栈底,则当top的值为-1时,则表示栈空,每次向栈中压入一个元素时,首先便top的值加1,然后再把数据元素在于该位置。

每次从栈中弹出一个元素时,首先取出栈顶元素,然后使top的值减1。指示新的栈顶元素。

顺序栈的基本操作:

1. 初始化栈Init_SqStack(SqStack* S)

顺序栈的初始化是要构造一个空的顺序栈。仅仅须要将空顺序栈S中的top置为-1,表示栈中眼下并没有数据元素,算法的复杂度为O(1)。

//初始化栈
void Init_SqStack(SqStack* S){
S->top = -1;
}

2.  推断栈空isEmpty_SqStack(SqStack* S)

由于栈底设置在数组的0下标处,即S->data[0]表示栈底元素。所以空栈时栈顶指针top=-1。若top=-1,则表示栈空。返回1,否则。则表示栈非空。返回0,算法的复杂度为O(1)。 

//推断栈空
int isEmpty_SqStack(SqStack* S){
if(S->top == -1)
return 1;
else
return 0;
}

3.  推断栈满isFull_SqStack(SqStack* S)

由于设置了栈的最大空间。所以在入栈时必须先推断栈是否已满,即当top= MAXSIZE时。则表示栈满,返回1,否则,则表示栈非空,返回0。算法的复杂度为O(1)。

//推断栈满
int isFull_SqStack(SqStack* S){
if(S->top == MAXSIZE)
return 1;
else
return 0;
}

4. 入栈 Push_SqStack(SqStack* S,ElemType x)

首先。检測栈是否已满。若是。则输出提示信息。结束,否则。指针top值加1,将元素x存于栈顶位置就可以,算法的复杂度为O(1)。

//入栈操作
void Push_SqStack(SqStack* S,ElemType x){
//栈满,则退出
if(isFull_SqStack(S)){
printf("栈满!\n");
exit(0);
}
else{
S->data[++(S->top)] = x;
}
}

5. 出栈Pop_SqStack(SqStack* S,ElemType* x)

首先,检測栈是否为空。若是。则输出提示信息,结束,否则,将栈顶元素赋值给x,并将指针top减1,。算法的复杂度为O(1)。

//出栈
void Pop_SqStack(SqStack* S,ElemType* x){
//假设栈空,则输出提示信息,并退出
if(isEmpty_SqStack(S)){
printf("栈空!\n");
exit(0);
}
else
*x = S->data[S->top--];
}

6. 读取栈顶元素Top_SqStack(SqStack* S,ElemType* x)

读顶元素与出栈运算都是取得栈顶元素的值,二者的差别在于:读栈顶元素时,栈顶指针不发生变化,仅读取栈顶元素,而出栈还要将栈顶元素删除,此时,栈顶指针也要发生变化,时间复杂度为O(1)

//读取栈顶元素
void Top_SqStack(SqStack* S,ElemType* x){
if(isEmpty_SqStack(S)){
printf("栈空!\n");
exit(0);
}
else
*x = S->data[S->top];
}

7. 输出整个栈Print_SqStack(SqStack* S)

输出栈。仅仅须要从栈顶開始读取到栈底。将栈中全部的数据元素输出就可以。

//输出整个栈
void Print_SqStack(SqStack* S){
if(isEmpty_SqStack(S)){
printf("栈空!\n");
exit(0);
}
int length = S->top;
while(length > -1)
printf("%d\t",S->data[length--]);
printf("\n"); }

数据结构(C实现)------- 顺序栈的更多相关文章

  1. 数据结构:C_顺序栈的实现

    数据结构顺序栈的实现(C语言版) 1.写在前面 栈是一种遵循元素先进(Push)后出(Pop)规则的线性表,它的实现可以用数组或者链表. ..... 2.代码分解 2.1对栈的结构定义: typede ...

  2. TOJ 数据结构实验--静态顺序栈

    描述 创建一个顺序栈(静态),栈大小为5.能够完成栈的初始化.入栈.出栈.获取栈顶元素.销毁栈等操作. 顺序栈类型定义如下: typedef struct {  int data[Max];    i ...

  3. 数据结构——Java实现顺序栈

    一.分析 栈是限定仅在表的一端进行插入或删除操作的线性表,对于栈来说,操作端称为栈顶,另一端则称为栈底,栈的修改是按照后进先出的原则进行的,因此又称为后进先出的线性表. 顺序栈是指利用顺序存储结构实现 ...

  4. TZOJ 数据结构实验--静态顺序栈

    描述 创建一个顺序栈(静态),栈大小为5.能够完成栈的初始化.入栈.出栈.获取栈顶元素.销毁栈等操作. 顺序栈类型定义如下: typedef struct {  int data[Max];    i ...

  5. 数据结构Java实现05----栈:顺序栈和链式堆栈

    一.堆栈的基本概念: 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除 ...

  6. 数据结构Java实现03----栈:顺序栈和链式堆栈

    一.堆栈的基本概念: 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除 ...

  7. 利用顺序栈解决括号匹配问题(c++)-- 数据结构

    题目: 7-1 括号匹配 (30 分)   给定一串字符,不超过100个字符,可能包括括号.数字.字母.标点符号.空格,编程检查这一串字符中的( ) ,[ ],{ }是否匹配. 输入格式: 输入在一行 ...

  8. 顺序栈操作--数据结构(C++)版

    最近学习数据结构,一开始接触感觉好难,颓废了一段时间,后来又重新翻开学习,突然感觉到很大的兴趣.对这些代码的运用都有了 一些新的认识.下面简单的讲述下最新学到的顺序栈,不知道大家学习的时候会不会有感觉 ...

  9. 【C#】【数据结构】005-栈:顺序栈

    C#数据结构:顺序栈 1.自定义顺序栈结构: /// <summary> /// 顺序栈 /// </summary> /// <typeparam name=" ...

  10. 数据结构 - 顺序栈的实行(C语言)

    数据结构-顺序栈的实现 1 顺序栈的定义 既然栈是线性表的特例,那么栈的顺序存储其实也是线性表顺序存储的简化,我们简称为顺序栈.线性表是用数组来实现的,对于栈这种只能一头插入删除的线性表来说,用数组哪 ...

随机推荐

  1. 315 Count of Smaller Numbers After Self 计算右侧小于当前元素的个数

    给定一个整型数组 nums,按要求返回一个新的 counts 数组.数组 counts 有该性质: counts[i] 的值是  nums[i] 右侧小于nums[i] 的元素的数量.例子:给定 nu ...

  2. Android sensor 系统框架 (一)

    这几天深入学习了Android sensor框架,以此博客记录和分享分析过程,其中难免会有错误的地方,欢迎指出! 这里主要分析KERNEL->HAL->JNI这3层的流程.主要从以下几方面 ...

  3. AIDL跨进程通信报Intent must be explicit

    在Android5.0机子上采用隐式启动来调试AIDL时,会出现Intent must be explicit的错误,原因是5.0的机子不允许使用隐式启动方式,解决的方法是:在启动intent时添加i ...

  4. Python初学1

    windows版python下载: https://pan.baidu.com/s/1dsAPp0C9PJUF73kFDdAzXQ 安装时勾选pip和Add python.exe to Path. w ...

  5. win32绘图基础

     获取设备环境句柄: (1)WM_PAINT消息中: PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd,&ps); EndPaint(hwnd,&ps ...

  6. JS——滚动条

    1.核心思想与之前的拖拽盒子是一样的 2.完全将鼠标在盒子中的坐标给滚动条是错的,因为这样会使滚动条顶部立刻瞬间移动到鼠标位置 3.必须在鼠标按下事件时记住鼠标在滚动条内部的坐标,再将鼠标在盒子中的坐 ...

  7. 易买网之smartupload实现文件上传

    经过俩个星期的奋斗,易买网项目完工.在之前,实现图片的上传,走过许多弯路,原来是好多基础的知识忘记了,没把smartupload文件包添加组件jar包至WEB-INF/lib包中,在此特别重视,做下文 ...

  8. js 判断 微信浏览器

    <script type="text/javascript"> window.onload = function() { isWeixinBrowser(); } // ...

  9. vue中fetch请求

    1. 请求方式:get 请求参数:menuName 返回的结果:data created(){ this._initPageData() }, methods:{ _initPageData(){ f ...

  10. sublime右键菜单,anaconda设置

    1.sublime_addright.inf [Version]Signature="$Windows NT$" [DefaultInstall]AddReg=SublimeTex ...