栈是限定仅在表的一端进行插入或删除的纯属表,通常称同意插入。删除的一端为栈顶(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. [转]linux之cut命令的用法

    转自:http://www.jb51.net/article/41872.htm cut是一个选取命令,就是将一段数据经过分析,取出我们想要的.一般来说,选取信息通常是针对“行”来进行分析的,并不是整 ...

  2. Java系列学习(十三)-字符串

    1.字符串基础 概念:字符串本质是打包字符数组的对象,是java.lang.String类的实例 2.字符串的构造方法 public String() public String(byte[] byt ...

  3. PHP MySQL 连接数据库,进行增、删、改、查、操作

    <table width="100%" border="1" cellpadding="0" cellspacing="0& ...

  4. 使用doxmate生成文档

    主页:http://html5ify.com/doxmate/ 在windows下面使用doxmate 1. 下载node.js(msi)并安装 http://www.nodejs.org/downl ...

  5. 在CentOS下搭建Android 开发环境

    在CentOS下搭建Android 开发环境 目录 1.环境搭建 1.1.JDK安装 1.2.Eclipse安装 1.3.ADT安装 1.4.Android SDK安装 1.5.Android NDK ...

  6. Python 之动态添加属性以及方法

    import types class Person(object): def __init__(self, newName, newAge): self.name = newName self.age ...

  7. Springboot启动工程后,浏览器出现输入用户名和密码

    在使用spring boot的时候发现启动项目时,浏览器需要输入用户名和密码. baidu后发现是因为pom中引用了Spring Security,但是项目中没有使用,在pom中注释掉即可.

  8. CAD在网页中打印的图纸里面添加页眉及页脚

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  9. 关于panda中dataframe的与&运算*(stackoverflow高票答案)

    85 down vote favorite 31 What explains the difference in behavior of boolean and bitwise operations ...

  10. 39.date hitogram基础知识

    主要知识点: date hitogram之统计每月电视销量     上一节讲到histogram,他是以数值进行分组.本节讲到以日期进行bucket分组操作,也就是说把连续的日期变成离散的日期区间,然 ...