栈是限定仅在表的一端进行插入或删除的纯属表,通常称同意插入。删除的一端为栈顶(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. IIS 配置 SVC

    IIS8中添加WCF支持几种方法小结[图文] 方法一 最近在做Silverlight,Windows Phone应用移植到Windows 8平台,在IIS8中测试一些传统WCF服务应用,发现IIS8不 ...

  2. 322 Coin Change 零钱兑换

    给定不同面额的硬币(coins)和一个总金额(amount).写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合方式能组成总金额,返回-1.示例 1:coins = [1, ...

  3. [转]Linux finger命令

    转自:http://os.51cto.com/art/201003/186354.htm Linux finger命令是系统管理员的必备命令之一,他可以清楚的告诉管理员有多少用户在同时使用他所管理的L ...

  4. 商业计算中Java高精度计算BigDecimal类

    <Effective Java> 第48条:如果需要精确的答案,请避免使用float和double. 如果我们编译运行下面这个程序会看到什么?public class Test{    p ...

  5. body全屏css/网页全屏设置/全屏样式

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  6. CommandBehavior.CloseConnection使用

    其用在ExecuteReader(c)中,返回对象前不能关闭数据库连接,须用CommandBehavior.CloseConnection: 这是一个关于实际知识点的问题,面试官考查的是应聘者数据库访 ...

  7. CSS——滑动门

    在背景图片中可以对图片进行圆角设置,但是这样是写死的.如下图: 情况分析:如果我们li标签中的文字变少了或者变多了,我们就需要重新定义背景图片.所以我们使用滑动门技术.它将图片特殊地方进行分割.宽度利 ...

  8. python2升级成python3

    系统环境centos 6.5原python版本2.6.6目标python版本3.5.11.下载python3.5wget --no-check-certificate  http://www.pyth ...

  9. 【sqli-labs】 less58 GET -Challenge -Double Query -5 queries allowed -Variation1 (GET型 挑战 双查询 只允许5次查询 变化1)

    单引号闭合成功,但是union select结果不对 http://192.168.136.128/sqli-labs-master/Less-58/?id=0' union select 1,2,3 ...

  10. CAD绘制一个直径标注(com接口VB语言)

    主要用到函数说明: _DMxDrawX::DrawDimDiametric 绘制一个直径标注.详细说明如下: 参数 说明 DOUBLE dChordPointX 在被标注的曲线上的第一个点X值 DOU ...