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

一、顺序栈

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

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. centos7安装python3.7和ipython

    一.centos7为刚安装的 1)配置yum源和epel源 采用国内源 查看yum的配置文件 (里面的镜像网址)是否ping的通 全部更改成 国内的 yum .epel源 在图中位置 下载相应的 re ...

  2. B - Sleuth

    Problem description Vasya plays the sleuth with his friends. The rules of the game are as follows: t ...

  3. windbg将调试信息保存到文本文件

    在跟踪一些出现频率较低的问题时,有时候需要长时间调试,但是在在输出信息太多时可能前面的日志会被清空,为避免这种情况,可以将输出日志记录到文本文件以备查看. 1. 可以在启动时直接用带 -logo的命令 ...

  4. ios -使用NSLayoutConstraint实现多个view等宽等高等间距

    @interface ViewController () { UIView *firstView; UIView *secondView; UIView *thirdView; } @end @imp ...

  5. python--5、包

    包 包,即一个包含__init__.py文件的文件夹,创建包的目的也就是为了用文件夹将文件(模块)组织起来.python3中,即使包里没有__init__.py文件,仍能import使用.而pytho ...

  6. Android 解析JSON

    上次讲了XML格式数据的解析方式,这次要说的是如何解析JSON数据格式,相对与XML,JSON解析数据的方式在于它的体积更小,在网络上传输可以更省流量. 这次在网上找到一个中国天气json数据的API ...

  7. php登陆和注册

    注册界面 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...

  8. 【SQL】BETWEEN操作符

    BETWEEN 操作符在 WHERE 子句中使用,作用是选取介于两个值之间的数据范围. 操作符 BETWEEN ... AND 会选取介于两个值之间的数据范围.这些值可以是数值.文本或者日期. 注意: ...

  9. 2013款MacBook Air装Windows7单系统

    经过两天的摸索,查找无数资料终于把2013款的MacBook Air装上了WIN 7,虽然网上有很多的资料但是都不是我想要的,第一个我的是2013款的MacBook Air,跟原来2012 11款Ma ...

  10. Android使用NDK---函数参数传递-基本类型和数组

    参考链接:http://www.cnblogs.com/luxiaofeng54/archive/2011/08/19/2145486.html 数据传输可分为 基本数据类型传输 和 引用数据类型的传 ...