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

一、顺序栈

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

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. AE错误代码解释

    每当我们在进行AE开发,出现错误时经常会出现错误代码,但是我们并不知道它到底代表什么意思,这里的而错误编码我们可以对照着找到我们需要的时候常详细信息(问题是,经常还是会出现没有错误编码HRESULT ...

  2. JSP页面使用EL表达式内容显示不全问题记录

    1.当EL表达式里面的值存在引号之类的字符时, ${caseparam.cp_value}的值为 {"cpage":"1","resType" ...

  3. Entity Framework -- 添加,删除,修改,关系依附,关系摘除,验证操作

    数据库模型 这个基本上是浓缩 Jerry Tom博客的内容,作为参考http://www.cnblogs.com/mbailing/archive/2012/07/31/2616779.html 说明 ...

  4. ie8及其以下版本兼容性问题之响应式

    解决办法:引入Respond.js让IE6-8支持CSS3 Media Query 使用方式 参考官方demo:http://scottjehl.github.com/Respond/test/tes ...

  5. 关于VM虚拟机在使用网络时与锐捷网络冲突的解决问题

    在使用NAT网络模式的时候,锐捷会因为冲突强制关闭NAT服务,导致虚拟机无法上网,解决的办法是让NAT服务一直保持启动,写一个bat脚本来一直检测服务是否在运行,并且进行启动操作. 当不需要用虚拟机的 ...

  6. CDC之fast->slow (1)

    Sampling slower signals into faster clock domains causes fewer potential problems than sampling fast ...

  7. SQL Server存储过程作业(一)

    创建客房类型表RoomType 创建客房状态表RoomState 创建客房信息表Room 创建结账状态表ResideState 创建客人信息表GuestRecord 编写sql语句 USE maste ...

  8. 时序分析:HMM模型(状态空间)

    关于HMM模型:时序分析:隐马尔科夫模型 HMM用于手势识别: 训练时每一种手势对应一个HMM-Model,识别率取最大的一个HMM即可.  类似于一个封装的完成多类识别器功能单层网络. 优点: 尤其 ...

  9. JNI传递字符串数组J-StringArray

    编译器对语言的转换以寻地址的方式进行序列化和反序列化,因此对于不固定类型或者不显示给出大小的对象不能直接解析,所以没有出现jstringArray这样的类型,只能一个一个编写. 参考链接:安卓开发提高 ...

  10. 【JSP】上传图片到数据库中

    第一步:建立数据库 create table test_img(id number(4),name varchar(20),img long raw); 第二步:(NewImg.html) <h ...