栈是限定仅在表的一端进行插入或删除的纯属表,通常称同意插入。删除的一端为栈顶(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. myeclipse配置tomcat后,无法正常使用的问题

    如图所示:一定要设置为Enable.否则部署tomcat时,没有tomcat8.0

  2. c# regex Match Matches MatchCollection 用法

    string text = "1A 2B 3C 4D 5E 6F 7G 8H 9I 10J 11Q 12J 13K 14L 15M 16N ffee80 #800080"; Reg ...

  3. 关于linux下的.a文件与 .so 文件

    连续几天终于将一个又一个问题解决了,这里说其中一个问题 描述问题:使用多线程pthread的时候,(我用的IDE,CODEBOLCKS)编译后发现直接弹出窗口,程序还没有被Build..巴拉巴拉,然后 ...

  4. SublimeText学习(二)-基本操作

    1.查看已安装的插件 看到已经安装的插件,看到了在上一篇中安装的Emmet 2.设置主题与字体 方法一: 方法二: 工具栏中 [Preference-浏览程序包]找到[Default文件夹]-用Sub ...

  5. mysql命令行导出数据

    1. 包含表头 mysql -h${1} -P${2} -u${3} -p${4} -Dpom_${5} --default-character-set=utf8 -B -e > result. ...

  6. ubuntu14.3安装phpmyadmin

    一.安装 sudo apt-get install phpmyadmin 二.软连接 cd /var/www/html/ sudo ln -s /usr/share/phpmyadmin phpmya ...

  7. SSL协议提供的服务

    SSL协议提供的服务主要有: 1)认证用户和服务器,确保数据发送到正确的客户机和服务器: 2)加密数据以防止数据中途被窃取: 3)维护数据的完整性,确保数据在传输过程中不被改变.

  8. Python 函数 day3

    函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可以自己创建函数,这 ...

  9. S-HR之OSF

    1):getWorkDayCount ->ArrayList data = (ArrayList) com.kingdee.shr.rpts.ctrlreport.osf.OSFExecutor ...

  10. HDU 2451 Simple Addition Expression(找规律,考验智商)

    题目 最近比赛的题目好多签到题都是找规律的考验智商的题目啊,,,我怎么越来越笨了,,,, 通过列举,可以发现规律: 从左往右按位扫这个数: 当数的长度大于1时: 当首位大于3时,答案就是4*4*4*… ...