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

一、顺序栈

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

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. c语言中struct的初始化

    C++中的struct已经和class一样,可以用构造函数初始化. C语言中的struct怎么初始化呢? typedef struct _TEST_T {        int i;        c ...

  2. Python描述符:property()函数的小秘密

    描述符:将某种特殊类型的类的实例指派给另一个类的属性(注意:这里是类属性,而不是对象属性).而这种特殊类型的类就是实现了__get__,__set__,__delete__这三个方法中的一个或多个的新 ...

  3. 【转载】JavaScript中同名标识符优先级-Snandy

    一,局部变量先使用后声明,不影响外部同名变量 var x = 1; // --> 外部变量x function fn(){ alert(x); // --> undefined 局部变量x ...

  4. 联想笋尖S90(S90-t 、S90-u)解锁BootLoader

    工具下载链接: http://pan.baidu.com/s/1eSgZuka 备用下载链接: http://pan.baidu.com/s/1dFKqSId 本篇教程,仅限于联想笋尖S90(S90- ...

  5. html中的小知识

    引用外部样式 样式表,如果是引用外部样式,不需要再写style标签了,因为 <link rel="stylesheet" type="text/css" ...

  6. react基础篇三

    事件处理 React事件绑定属性的命名采用驼峰式写法,而不是小写. 如果采用 JSX 的语法你需要传入一个函数作为事件处理函数,而不是一个字符串(DOM元素的写法) 例如,传统的 HTML: < ...

  7. How to add jdk8 in Eclipse Indigo

    I just read How to have Eclipse use JDK8 to compile a project? What i added jdk8 to eclipse as,  Fro ...

  8. BZOJ 3450: Tyvj1952 Easy 数学期望

    Code: #include <bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) ...

  9. TensorFlow学习笔记----安装(1)

    在入门前,推荐一个博客链接:https://morvanzhou.github.io/tutorials/machine-learning/tensorflow/ Windows下tensorflow ...

  10. 【剑指Offer】40、数组中只出现一次的数字

      题目描述:   一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度为O(n),空间复杂度为O(1).   解题思路:   这道题目相对比较难 ...