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

一、顺序栈

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

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. [转]"RDLC"报表-参数传递及主从报表

    本文转自:http://www.cnblogs.com/yjmyzz/archive/2011/09/19/2180940.html 今天继续学习RDLC报表的“参数传递”及“主从报表” 一.先创建D ...

  2. php解析 html类库 simple_html_dom

    如果从字符串加载html文档,需要先从网络上下载.建议使用cURL来抓取html文档并加载DOM中. 查找html元素 可以使用find函数来查找html文档中的元素.返回的结果是一个包含了对象的数组 ...

  3. 5.30dao-service-controller层,mybatis自动生成。(获取根据id主键获取指定详细数据)

    获取权限详细数据:(参考)                    1.controller:1.注入Servcie调用方法findConsumerById(参数是id);               ...

  4. LinkedList 源码

    1.类继承结构            结构: 2.成员及方法                 注意:其中      getFirst,getLast,removeFirst,removeLast,el ...

  5. 创建一个类Person

    创建一个类Person,包含以下属性:姓名(name).年龄(age).朋友(friends数组).问候(sayhi方法,输出问候语,例如:"你好!").交朋友(addFriend ...

  6. GET 请求控制器 返回绑定后HTML

    //$.get("/Home/index/" + $("#S_BookName").val(), function (data) { //MVC控制器返回Vie ...

  7. BPM结束任务

    var pi = tw.system.findProcessInstanceByID("158");for(var i=0; i<pi.tasks.length; i++) ...

  8. 单调队列 && 单调栈

    单调队列 && 单调栈 单调队列 维护某个滑动区间的min or max,可用于dp的优化 以维护min为例,采用STL双端队列实现 每次加入元素x前 先检查队首元素==滑动后要删除的 ...

  9. shell常用语法

    for.if条件: https://blog.51cto.com/qiufengsong/1252889 一.for循环: );do echo $i done ###第一行:seq是指1到10,第二行 ...

  10. php第三节课

    正则表达式 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w ...