栈是一种特殊的线性表,插入和删除操作均在栈顶进行,插入操作称为入栈,删除操作称为出栈。

一、顺序栈

利用顺序存储方式实现的栈称为顺序栈,下面是它的一些基本操作实现算法,需要理解和记忆。

1.顺序栈的类型定义

#define StackSpaceIncr 20
typedef struct{
SElemType *base;
int top;
int stackSize;
}SqStack;//顺序栈类型

2.初始化操作InitSqStack(&S,InitSize)

Status InitSqStack( SqStack &S,int InitSize)
{
S.base=(SElemType *)malloc(InitSize * sizeof(SElemType));
if(!S.base) return OVERFLOW;//若失败
S.stackSize=InitSize;
S.top=;//置为空栈
return OK;
}

3.判空操作stackIsEmpty(S)

Status stackIsEmpty(SqStack S)
{
if(!S.top) return TRUE;
else return FALSE;
}

4.清空操作clearStack(&S)

void clearStack(SqStack &S)
{
S.top=;
}

5.求栈长操作stackLength(S)

int stackLength(SqStack S)
{
return S.top;
}

6.入栈操作Push(&S,e)

Status Push(SqStack &S,SElemType e)
{
SElemType * newBase;
if(S.top==S.stackSize)
{
newBase=(SElemType *)realloc(S.base,(S.stackSize+StackSpaceIncr)*sizeof(SElemType));
if(! newBase) return OVERFLOW;//失败
S.base=newBase;
S.stackSize+=StackSpaceIncr;//成功
}
S.base[S.top]=e;//插入元素e
S.top++;//栈顶指针top上移
return OK;
}

7.出栈操作Pop(&S,&e)

Status Pop(SqStack &S,SElemType &e)
{
if(!S.top) return ERROR;//若失败
S.top--;//栈顶指针top下移
e=S.base[S.top];
return OK;
}

8.取栈顶操作getTop(S,&e)

Status getTop(SqStack S,SElemType &e)
{
if(! S.top) return ERROR;
e=S.base[S.top-];
return OK;
}

二、链式栈

利用链式存储结构实现的栈称为链式栈,利用单链表实现链式栈时,其初始化、判空、清空、求长度操作都与单链表相同。

1.链式栈类型定义

#define StackSpaceIncr 20
typedef struct stackNode
{
SElemType data;
struct stackNode *next;
}*LinkStack;//链式栈类型

2.初始化操作InitLinkStack(&S)

void InitLinkStack(LinkStack &S)
{
//初始化为空
S=NULL;
}

3.入栈操作Push(&S,e)

Status Push(LinkStack &S,SElemType e)
{
LinkStack p;
p=(LinkStack)malloc(sizeof(struct stackNode));
if(!p) return OVERFLOW;
p->data=e;
p->next=S;
S=p;//在单链表的首端插入p结点
return OK;
}

4.出栈操作Pop(&S,&e)

Status Pop(LinkStack &S,SElemType &e)
{
LinkStack p;
if(!S) return ERROR;
p=S;
S=S->next;
e=p->data;
free(p);
return OK;
}

5.取栈顶操作getTop(S,&e)

Status getTop(LinkStack S,SElemType &e)
{
if(! S) return ERROR;
e=S->data;
return OK;
}

三、栈的实例——简单的括号匹配检验

 #include <stdio.h>
#include <stdlib.h>
#include "Status.h"
typedef char SElemType;
#include "SqStack.h"
int bracketsCheck()
{
char ch;
SqStack S;
InitSqStack(S,);
ch=getchar();
while(ch!='\n')
{
if(ch=='(') Push(S,ch);
else if(ch==')')
{
if(!stackIsEmpty(S)) Pop(S,ch);
else return -;
}
ch=getchar();
}
return stackLength(S);
}
int main()
{
int result;
printf("输入表达式串:\n");
result=bracketsCheck();
if(result==) printf("括号匹配不正确!\n");
else if(result>) printf("错误,缺%d个\')\'! \n",result);
else printf("错误,缺少1个或多个\'(\'!\n");
system("pause");
return ;
}

数据结构(三)——栈Stack的更多相关文章

  1. Python与数据结构[1] -> 栈/Stack[0] -> 链表栈与数组栈的 Python 实现

    栈 / Stack 目录 链表栈 数组栈 栈是一种基本的线性数据结构(先入后出FILO),在 C 语言中有链表和数组两种实现方式,下面用 Python 对这两种栈进行实现. 1 链表栈 链表栈是以单链 ...

  2. 数据结构之栈(Stack)

    什么是栈(Stack) 栈是一种遵循特定操作顺序的线性数据结构,遵循的顺序是先进后出(FILO:First In Last Out)或者后进先出(LIFO:Last In First Out). 比如 ...

  3. [ACM训练] 算法初级 之 数据结构 之 栈stack+队列queue (基础+进阶+POJ 1338+2442+1442)

    再次面对像栈和队列这样的相当基础的数据结构的学习,应该从多个方面,多维度去学习. 首先,这两个数据结构都是比较常用的,在标准库中都有对应的结构能够直接使用,所以第一个阶段应该是先学习直接来使用,下一个 ...

  4. 数据结构11: 栈(Stack)的概念和应用及C语言实现

    栈,线性表的一种特殊的存储结构.与学习过的线性表的不同之处在于栈只能从表的固定一端对数据进行插入和删除操作,另一端是封死的. 图1 栈结构示意图 由于栈只有一边开口存取数据,称开口的那一端为“栈顶”, ...

  5. Python与数据结构[1] -> 栈/Stack[1] -> 中缀表达式与后缀表达式的转换和计算

    中缀表达式与后缀表达式的转换和计算 目录 中缀表达式转换为后缀表达式 后缀表达式的计算 1 中缀表达式转换为后缀表达式 中缀表达式转换为后缀表达式的实现方式为: 依次获取中缀表达式的元素, 若元素为操 ...

  6. 线性数据结构之栈——Stack

    Linear data structures linear structures can be thought of as having two ends, whose items are order ...

  7. C# 数据结构 栈 Stack

    栈和队列是非常重要的两种数据结构,栈和队列也是线性结构,线性表.栈和队列这三种数据结构的数据元素和元素的逻辑关系也相同 差别在于:线性表的操作不受限制,栈和队列操作受限制(遵循一定的原则),因此栈和队 ...

  8. 数据结构之栈(stack)的实现

    一.栈 1.定义 栈的英文为(stack),是一种数据结构 栈是一个先入后出(FILO-First In Last Out)的有序列表. 栈(stack)是限制线性表中元素的插入和删除只能在线性表的同 ...

  9. STL函数库的应用第三弹——数据结构(栈)

    Part 1:栈是什么 栈(stack)又名堆栈,它是一种运算受限的线性表.限定仅在表尾进行插入和删除操作的线性表. 这一端被称为栈顶,相对地,把另一端称为栈底. 向一个栈插入新元素又称作进栈.入栈或 ...

  10. 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现

      本篇是java数据结构与算法的第2篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型   栈是 ...

随机推荐

  1. 从flink-example分析flink组件(1)WordCount batch实战及源码分析

    上一章<windows下flink示例程序的执行> 简单介绍了一下flink在windows下如何通过flink-webui运行已经打包完成的示例程序(jar),那么我们为什么要使用fli ...

  2. [BZOJ2017][Usaco2009 Nov]硬币游戏(要复习系列)

    又是DP? 好吧,或者说是博弈论,但是我不会啊. 先搞个O(n^3)的记忆化搜索,然后瞎搞好像发现两个状态几乎一样? 竟然过了样例,然后竟然A了... #include<iostream> ...

  3. python之路——常用模块

    阅读目录 认识模块 什么是模块 模块的导入和使用 常用模块一 collections模块 时间模块 random模块 os模块 sys模块 序列化模块 re模块 常用模块二 hashlib模块 con ...

  4. Djnago进阶

    详情请戳 Cookie和Session及分页设置 Ajax Django中间件 Form和ModelForm组件 auth认证组件 Django 缓存的使用 Django 信号的使用 Django a ...

  5. jquery.validate验证text,checkbox,radio,selected

    index.cshtml <form id="formLogin" method="post"> <div> <label for ...

  6. 关于如何将_variant_t型转化为int型和string类型

    1)将_variant_t型转化为int型 关于将_variant_t型转化为int型,网上有好多好多参考,但好多都很复杂并且还不对,其实整个转化过程就只一行代码可以搞定: _variant_t a; ...

  7. mysql Workbench新建数据库连接时提示SSl not enabled的问题

    在使用workbench时会弹出以下的对话框,不过这不影响使用,点击ok之后对话框关闭,接着直接点击close就行了,之后会显示已经连接上了数据库.具体ssl的方面还没研究,等研究了再贴

  8. C#程序集版本控制文件属性祥解

    using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices ...

  9. AI:IPPR的数学表示-CNN基本结构分析( Conv层、Pooling层、FCN层/softmax层)

    类似于SVM,CNN为代表的DNN方法的边缘参数随着多类和高精度的要求必然增长.比如向量机方法,使用可以映射到无穷维的高斯核,即使进行两类分类,在大数据集上得到高精度,即保持准确率和高精度的双指标,支 ...

  10. C# 聚合数据借口发短信的使用

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...