文章目录

  • 一、栈的基本概念
  • 二、栈的基本操作
    • 1.创建一个栈
    • 2.初始化栈
    • 3.销毁栈
    • 4.判定S是否为空
    • 5.求栈的长度
    • 6.取栈顶元素
    • 7.遍历打印栈
    • 8.入栈操作
    • 9.出栈操作
  • 三,完整代码
  • 四,栈的应用

一、栈的基本概念

栈(stack)是限定仅在表尾进行插入和删除操作的线性表

我们把允许插入和删除的一端成为栈顶,另一端为栈底,不含任何数据元素的栈称为空栈。特点是“先进后出(LIFO结构)”


二、栈的基本操作

1.创建一个栈

代码如下(示例):

#include <stdio.h>
#include <stdlib.h>#define StackInitSize 10 // 初始化栈的最大长度
#define StackIncrement 10 // 若栈最大空间不够时,需要增加的长度
typedef int ElemType;
typedef int Status;typedef struct {ElemType* base; // 栈底指针ElemType* top; // 栈顶指针int stacksize; // 栈的最大长度
} SqStack;

2.初始化栈

代码如下(示例):

//构造一个空栈S
Status InitStack(SqStack &S) {// 分配初始空间S->base = (ElemType*)malloc(StackInitSize * sizeof(ElemType));if (!S->base) {exit(0);}S->top = S->base; /// 栈顶与栈底相同S->stacksize = StackInitSize; // 栈的最大长度等于初始长度return 1;
}

3.销毁栈

代码如下(示例):

// 栈顶栈底指针置为NULL,长度置为0
Status DestroyStack(SqStack* S) {free(S->base);S->base = S->top = NULL;S->stacksize = 0;return 1;
}

4.判定S是否为空

Status StackEmpty(SqStack* S) {return S->base == S->top;//判断栈顶指针与栈底指针是否相同
}

5.求栈的长度

Status StackLength(SqStack* S) {if (S->top == S->base) {return 0;}return (Status)(S->top - S->base);//栈顶减去栈底指针即为栈的长度
}

6.取栈顶元素

Status GetTop(SqStack* S, int &e) {if (S->top == S->base) {return 0;}e = *(S->top - 1);return e;
}

7.遍历打印栈

Status TraverseStack(SqStack* S) {ElemType* p;if (S->top == S->base) {printf("Stack is NULL.\n");return 0;}p = S->top;while (p > S->base) {p--;printf("%d ", *p);}printf("\n");return 1;
}

8.入栈操作

Status Push(SqStack* S, int &e) {// 若栈的最大长度不会够用时,重新开辟,增大长度if (S->top - S->base >= S->stacksize) {S->base = (ElemType*)realloc(S->base, (S->stacksize + StackIncrement) * sizeof(ElemType));if (!S->base) {return 0;}// 栈顶指针为栈底指针加上栈之前的最大长度S->top = S->base + S->stacksize;// 栈当前的最大长度等于栈之前的最大长度与增加的长度之和S->stacksize += StackIncrement;}*S->top++ = e; // 先赋值,后栈顶指针上移return e;
}

9.出栈操作

 Status Pop(SqStack* S, int &e) {if (S->base == S->top) {return 0;}e = *--S->top;  // 栈顶指针先下移,后赋值return e;
}

三,完整代码

#include <stdio.h>
#include <stdlib.h>#define StackInitSize 10 // 初始化栈的最大长度
#define StackIncrement 10 // 若栈最大空间不够时,需要增加的长度
typedef int ElemType;
typedef int Status;typedef struct {ElemType* base; // 栈底指针ElemType* top; // 栈顶指针int stacksize; // 栈的最大长度
} SqStack;// 初始化栈
Status InitStack(SqStack *S) {// 分配初始空间S->base = (ElemType*)malloc(StackInitSize * sizeof(ElemType));if (!S->base) {exit(0);}S->top = S->base; /// 栈顶与栈底相同S->stacksize = StackInitSize; // 栈的最大长度等于初始长度return 1;
}// 判断栈是否为空,只需要判断栈顶指针与栈底指针是否相同即可
Status StackEmpty(SqStack* S) {return S->base == S->top;
}//获取栈的实际长度,栈顶减去栈底指针即为栈的长度
Status StackLength(SqStack* S) {if (S->top == S->base) {return 0;}return (Status)(S->top - S->base);
}// 获取栈顶的元素,参数e用来存放栈顶的元素
Status GetTop(SqStack* S, int  &e) {if (S->top == S->base) {return 0;}e = *(S->top - 1);return e;
}// 进栈,参数e是要进栈的元素
Status Push(SqStack* S, int  &e) {// 若栈的最大长度不会够用时,重新开辟,增大长度if (S->top - S->base >= S->stacksize) {S->base = (ElemType*)realloc(S->base, (S->stacksize + StackIncrement) * sizeof(ElemType));if (!S->base) {return 0;}// 栈顶指针为栈底指针加上栈之前的最大长度S->top = S->base + S->stacksize;// 栈当前的最大长度等于栈之前的最大长度与增加的长度之和S->stacksize += StackIncrement;}*S->top++ = e; // 先赋值,后栈顶指针上移return e;
}// 出栈,参数e用来存放出栈的元素
Status Pop(SqStack* S, int &e) {if (S->base == S->top) {return 0;}e = *--S->top; // 栈顶指针先下移,后赋值return e;
}// 销毁栈,释放栈空间,栈顶栈底指针置为NULL,长度置为0
Status DestroyStack(SqStack* S) {free(S->base);S->base = S->top = NULL;S->stacksize = 0;return 1;
}// 遍历栈,依次打印每个元素
Status TraverseStack(SqStack* S) {ElemType* p;if (S->top == S->base) {printf("Stack is NULL.\n");return 0;}p = S->top;// 由栈顶依次向下遍历while (p > S->base) {p--;printf("%d ", *p);}printf("\n");return 1;
}int main() {SqStack q, * S;S = &q;int i, n, e;InitStack(S);printf("输入栈的长度:\n");scanf("%d", &n);for (i = 1; i <= n; i++) {scanf("%d", &e);Push(S, e);}printf("是否为空栈\n");if (StackEmpty(S)) {printf("Yes!\n");}else {printf("No!\n");}printf("栈的长度是 %d.\n", StackLength(S));printf("遍历这个栈:\n");TraverseStack(S);GetTop(S, e);printf("栈顶元素为 %d.\n", e);printf("输入一个入栈的数 :\n");scanf("%d", &e);Push(S, e);printf("新的栈为 :\n");TraverseStack(S);printf("删除栈顶的数 : ");e = Pop(S, e);printf("%d\n", e);printf("新的栈为 :\n");TraverseStack(S);printf("销毁栈 :\n");DestroyStack(S);TraverseStack(S);return 0;
}

四,栈的应用


思路如下:
1.利用一个栈结构保存每个出现的左括号,当遇到右括号时,从栈中弹出左括号,检验匹配情况。
2.在检验过程中,若遇到以下几种情况之一,就可以得出括号不匹配的结论。
(1)当遇到某一个右括号时,栈已空,说明到目前为止,右括号多于左括号;
(2)从栈中弹出的左括号与当前检验的右括号类型不同,说明出现了括号交叉情况;
(3)算术表达式输入完毕,但栈中还有没有匹配的左括号,说明左括号多于右括号。

代码如下:

bool isValid(char * s){int length = strlen(s);     //求出字符串s的长度char Stack[length];         //定义一个顺序栈int top = -1;               //初始化栈//从左往右扫描字符串sfor(int i = 0; i < length; i++){                        if(s[i] == '(' || s[i] == '[' || s[i] == '{'){    //扫描到“左括号”Stack[++top] = s[i];                           //将“左括号”入栈}else{ if(top == -1)return false;           //扫描到“右括号”且栈为空,则括号匹配失败(“右括号”为单身)char topElem; topElem = Stack[top--];     //出栈一个元素并赋值给topElemif(s[i] == ')' && topElem != '(')return false;                   //左右括号不匹配if(s[i] == ']' && topElem != '[')return false;                   //左右括号不匹配if(s[i] == '}' && topElem != '{')return false;                   //左右括号不匹配}}if(top != -1)return false;    //扫描到完字符串s后栈不空,则括号匹配失败(“左括号”为单身)return true;}

栈的基本操作及其应用相关推荐

  1. 数据结构源码笔记(C语言):栈的基本操作

    #include <stdio.h> #define MaxSize 100typedef char ElemType;typedef struct {char stack[MaxSize ...

  2. sdut 3335 数据结构实验之栈与队列八:栈的基本操作

    数据结构实验之栈与队列八:栈的基本操作 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Descri ...

  3. c++:栈的基本操作+实例:迷宫求解

    栈的基本操作+实例:迷宫求解 #include<iostream> using namespace std;struct Node {int datai;int dataj;Node* n ...

  4. python 链栈及基本操作

    链栈,即用链表实现栈存储结构 链栈的实现思路同顺序栈类似,顺序栈是将顺序表(数组)的一端作为栈低,另一端为栈顶:链栈也如此,通常我们将链表的头部作为栈顶,尾部作为栈低,如图1所示: 将链表头部作为栈顶 ...

  5. 二叉树和栈的基本操作

    二叉树和栈的基本操作 Tree.h: #pragma once#define _CRT_SECURE_NO_WARNINGS#include <stdio.h> #include < ...

  6. 数据结构-“栈”的基本操作

    栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表.它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出 ...

  7. 重学数据结构004——栈的基本操作及实现(数组实现)

    上文提到过栈以及栈的基本操作.上文中是基于链表做的实现.但是这种方法会出现大量的malloc()和free()操作,这种开销是非常昂贵的. 另外一种实现方式是基于数组的实现.这种实现方式需要预先制定一 ...

  8. 栈的基本操作 python

    7-4 栈的基本操作 (10 分) 给定一个初始为空的栈和一系列进栈.出栈操作,请编写程序输出经过这些操作后栈的元素.栈的元素值均为整数. 输入格式: 输入第1行为1个正整数n,表示操作个数: 第2行 ...

  9. 链栈的基本操作-C语言

    链栈的基本操作 用链表实现一个栈 具体实现 定义一个链栈 //定义一个链栈 typedef struct LNode {int data;struct LNode* next; }LNode, *Li ...

  10. C语言实现顺序栈的基本操作(初始化、判断空、入栈、出栈、获取栈顶元素)

    //顺序栈的基本操作 #include<stdio.h> #define MaxSize 50 typedef int ElemType; //定义栈结构体 typedef struct ...

最新文章

  1. 开关电源输出整流二极管
  2. PendingIntent详解
  3. 2017 ACM/ICPC Asia Regional Qingdao Online 记录
  4. 网站外链查询接近100%精确的方法
  5. vue 2.6 中 slot 的新用法
  6. Instagram:如何提升音乐音频质量?
  7. android遥控器按键传输流程,android 海思平台遥控器按键映射流程
  8. 前端导出文件,后端返回文件流过大直接干崩溃
  9. BZOJ 1791 岛屿(环套树+单调队列DP)
  10. 宝塔php扩展fil_宝塔面板安装Redis给WordPress网站加速优化教程
  11. @NotBlank注解地正确使用
  12. 蓝桥杯嵌入式板-解决LCD使LED亮灭混乱的办法
  13. Python压缩文件夹/解压缩zip文件
  14. Bailian2757 最长上升子序列【DP】
  15. Hot Swap failed:add method not implemented
  16. Unity+罗技G29方向盘+Realistic Car Controller 制作简单的模拟驾驶
  17. 翻译www.djangobook.com之第一章:Django介绍
  18. 北京中波(AM-MW)无线广播发射频率/频道表 (转载)
  19. java事务是怎么处理的_Java事务处理
  20. 树的计数 + prufer序列与Cayley公式(转载)

热门文章

  1. 论文阅读《Vision-Aided RAIM: A New Method for GPS Integrity Monitoring in Approach and Landing Phase》1
  2. 服务器许可证密钥,如何生成和验证软件许可证密钥?
  3. Python 调用 HTTP API 接口模板
  4. Linux系统使用教程
  5. 网站以前ico图标替换新图后还显示以前的图标
  6. Linux中IP地址的配置
  7. 合并PDF文件-pdftk下载
  8. 《redis设计与实现》 读书笔记
  9. (转载)深入分析HDFS原理及读写流程
  10. 支付宝直付通管理系统,进件二级商户