文章目录

  • 一、栈的基本概念
  • 二、栈的基本操作
    • 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. ipone11android,iphone12全系配置曝光不如买iPhone11 安卓和苹果谁更香
  2. 【Android】Activity的task相关
  3. 【Android】16.3 带Intent过滤器的Services
  4. 面试指南(一):想跳槽,你真的做好准备了吗?
  5. 两局域网互联解决方案
  6. atitit.自己动手开发编译器and解释器(2) ------语法分析,语义分析,代码生成--attilax总结
  7. 玩转树莓派——游戏主机模拟器
  8. cas22112-84-1/5,10,15,20-四(4-氨基苯)-21H,23H-卟啉简称:H2TAPP; Tph
  9. 字符间距和文字效果(转)
  10. python实现千牛客服自动回复语_千牛自动回复设置话术
  11. 使用WireShark查看TCP的三次握手
  12. RESTful API 末尾斜杠
  13. 什么是云原生的应用?
  14. Linux进程通信-管道
  15. 水雨情监测系统 实时监测
  16. 基于SSM在线学习网站包含课程管理-错题-收藏-考试测试-学生教师管理员58198(idea-javaweb-javaee-j2ee-springboot)
  17. 计算机二级证书是什么类型,国家计算机二级是什么证书?
  18. PlantSimulation运行卡顿-查找问题方案
  19. linux3.0操作系统下载,GNOME下载3.0 正式版_新一代桌面用户界面的Linux操作系统下载...
  20. amos里CFA可行性辨别结果怎么看_论文用问卷调查法,数据分析怎么做?

热门文章

  1. c语言关键字查询,c语言关键字
  2. 日期时间格式 - 助手类[方法] - 收集
  3. windows 7 系统 使用NVMe固态硬盘----打补丁(安装程序遇到错误0x80240037)
  4. Ubuntu 桌面系统升级
  5. 混音服务器系统盘,电脑开启和关闭立体声混音的详细步骤
  6. mysql 未指定驱动程序_[ODBC驱动程序管理器]未发现数据源名称并且未指定默认驱动程序...
  7. ARM裸板调试之串口打印及栈初步分析
  8. 因为接了一个外包 我在监狱蹲了456天!
  9. 数据库系统概论第五版(第 3 章 关系数据库标准语言SQL)习题答案
  10. 模拟IO口简单呼吸灯程序