数据结构:Stack
Stack设计与实现
Stack基本概念
栈是一种 特殊的线性表
栈仅能在线性表的一端进行操作
栈顶(Top):允许操作的一端
栈底(Bottom):不允许操作的一端
Stack的常用操作
创建栈
销毁栈
清空栈
进栈
出栈
获取栈顶元素
获取栈的大小
C语言描述=====》栈的设计与实现 人生财富库积累 |
#ifndef _MY_STACK_H_ #define _MY_STACK_H_
typedef
Stack* Stack_Create();
void Stack_Destroy(Stack* stack);
void Stack_Clear(Stack* stack);
int Stack_Push(Stack* stack, void* item);
void* Stack_Pop(Stack* stack);
void* Stack_Top(Stack* stack);
int Stack_Size(Stack* stack);
#endif |
栈的顺序存储设计与实现
1、基本概念
2、设计与实现
头文件 |
#ifndef __MY_SEQLIST_H__ #define __MY_SEQLIST_H__
typedef void SeqList; typedef void SeqListNode;
SeqList* SeqStack_Create(int capacity);
void SeqStack _Destroy(SeqStack * list);
void SeqStack _Clear(SeqStack * list);
int SeqStack _Length(SeqStack * list);
int SeqStack _Capacity(SeqStack * list);
int SeqStack _Insert(SeqStack * list, SeqListNode* node, int pos);
SeqListNode* SeqList_Get(SeqList* list, int pos);
SeqListNode* SeqList_Delete(SeqList* list, int pos);
#endif //__MY_SEQLIST_H__ |
栈的链式存储设计与实现
1、基本概念
2、设计与实现
头文件 |
#ifndef _MY_LINKSTACK_H_ #define _MY_LINKSTACK_H_
typedef void LinkStack;
LinkStack* LinkStack_Create();
void LinkStack_Destroy(LinkStack* stack);
void LinkStack_Clear(LinkStack* stack);
int LinkStack_Push(LinkStack* stack, void* item);
void* LinkStack_Pop(LinkStack* stack);
void* LinkStack_Top(LinkStack* stack);
int LinkStack_Size(LinkStack* stack);
#endif //_MY_LINKSTACK_H_ |
栈的应用
应用1:就近匹配 |
几乎所有的编译器都具有检测括号是否匹配的能力 如何实现编译器中的符号成对检测? #include |
算法思路 从第一个字符开始扫描 当遇见普通字符时忽略,当遇见左符号时压入栈中 当遇见右符号时从栈中弹出栈顶符号,并进行匹配 匹配成功:继续读入下一个字符 匹配失败:立即停止,并报错 结束: 成功: 所有字符扫描完毕,且栈为空 失败:匹配失败或所有字符扫描完毕但栈非空 |
当需要检测成对出现但又互不相邻的事物时 可以使用栈"后进先出"的特性 栈非常适合于需要"就近匹配"的场合 |
计算机的本质工作就是做数学运算,那计算机可以读入字符串 "9 + (3 - 1) * 5 + 8 / 2"并计算值吗? |
应用2:中缀 后缀 |
计算机的本质工作就是做数学运算,那计算机可以读入字符串 "9 + (3 - 1) * 5 + 8 / 2"并计算值吗? |
后缀表达式 ==?符合计算机运算 波兰科学家在20世纪50年代提出了一种将运算符放在数字后面的后缀表达式对应的, 我们习惯的数学表达式叫做中缀表达式===》符合人类思考习惯 |
实例: 5 + 4=> 5 4 + 1 + 2 * 3 => 1 2 3 * + 8 + ( 3 – 1 ) * 5 => 8 3 1 – 5 * + |
中缀表达式符合人类的阅读和思维习惯 后缀表达式符合计算机的"运算习惯" 如何将中缀表达式转换成后缀表达式? |
中缀转后缀算法: |
遍历中缀表达式中的数字和符号 对于数字:直接输出 对于符号: 左括号:进栈 运算符号:与栈顶符号进行优先级比较 若栈顶符号优先级低:此符合进栈 (默认栈顶若是左括号,左括号优先级最低) 若栈顶符号优先级不低:将栈顶符号弹出并输出,之后进栈 右括号:将栈顶符号弹出并输出,直到匹配左括号 遍历结束:将栈中的所有符号弹出并输出 中缀转后缀 |
计算机是如何基于后缀表达式计算的? 8 3 1 – 5 * + |
遍历后缀表达式中的数字和符号 对于数字:进栈 对于符号: 从栈中弹出右操作数 从栈中弹出左操作数 根据符号进行运算 将运算结果压入栈中 遍历结束:栈中的唯一数字为计算结果 |
栈的神奇! 中缀表达式是人习惯的表达方式 后缀表达式是计算机喜欢的表达方式 通过栈可以方便的将中缀形式变换为后缀形式 中缀表达式的计算过程类似程序编译运行的过程 |
扩展:给你一个字符串,计算结果 "1+2*(66/(2*3)+7)" 1 字符串解析 词法语法分析 优先级分析 数据结构选型===》栈还是树? |
数据结构:Stack的更多相关文章
- 数据结构-Stack和Queue
实现: #include "c2_list.h" template <typename object> class Stack{ public: bool isEmpt ...
- Stack的三种含义
作者: 阮一峰 日期: 2013年11月29日 学习编程的时候,经常会看到stack这个词,它的中文名字叫做"栈". 理解这个概念,对于理解程序的运行至关重要.容易混淆的是,这个词 ...
- SPL标准库常用的数据结构
栈数据结构 $stack = new SplStack(); //栈数据结构->先进后出 2 $stack->push('data1'); //入栈 $stack->push('da ...
- STL总结之queue, priority_queue, stack
之所以把这三个容器放在一起,是因为他们都是容器适配器. STL中queue就是我们常用的FIFO队列,实现是一个容器适配器,这种数据结构在网络中经常使用. queue的模板声明: templa ...
- 数据结构算法集---C++语言实现
//数据结构算法集---C++语言实现 //各种类都使用模版设计,可以对各种数据类型操作(整形,字符,浮点) /////////////////////////// // // // 堆栈数据结构 s ...
- Stack的三种含义(数据超过栈的大小,就发生stack overflow)
非常典型的基础知识,转自http://www.ruanyifeng.com/blog/2013/11/stack.html 学习编程的时候,经常会看到stack这个词,它的中文名字叫做"栈& ...
- Stack的三种含义(转载--阮一峰)
作者: 阮一峰 学习编程的时候,经常会看到stack这个词,它的中文名字叫做"栈". 理解这个概念,对于理解程序的运行至关重要.容易混淆的是,这个词其实有三种含义,适用于不同的场合 ...
- Stack栈的三种含义
理解stack栈对于理解程序的执行至关重要.easy混淆的是,这个词事实上有三种含义,适用于不同的场合,必须加以区分. 含义一:数据结构 stack的第一种含义是一组数据的存放方式,特点为LIFO,即 ...
- [转帖]Stack的三种含义
Stack的三种含义 http://www.ruanyifeng.com/blog/2013/11/stack.html 学习编程的时候,经常会看到stack这个词,它的中文名字叫做"栈&q ...
- Java堆(heap)、栈(stack)和队列的区别
Java里面Stack有两种含义: 一:数据结构 Stack,即java.util.Stack import java.util.Stack; import java.util.Iterator; i ...
随机推荐
- 牛客网剑指Offer——正则表达式匹配
1. 题目描述 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整 ...
- 网页的缓存Cache与控制
什么是缓存 Cache? 缓存位于客户端与服务器之间, 或者服务器与服务器之间.它决定是否保存所获资源的副本,以及如何使用副本,何时更新副本,这里所说的资源包括页面的HTML, 图片,文件等等. 使用 ...
- Solr——从postgresql数据库导入数据
1,配置准备 本文的前提是你已经配置好了solr,并新创建了一个core,我们下面都会按照前一篇文章中的core_demo为基础开始 2,修改soreconfig.xml 在soreconfig.xm ...
- SpringBoot在Kotlin中的实现(二)
根据现在的开发模式和网上的一些资料,SpringBoot需要对业务和操作进行分层,通常分为controller.entity.service.respository等结构.下面以Kotlin官网的例子 ...
- (转)微信小程序开发—弹出框
原文地址 <span style="font-family:Comic Sans MS;font-size:18px;color:#333333;"><view ...
- OraOLEDB.Oracle找不到驱动问题
如果安装Oracle的时候没有把Oracle Provider for OLE DB,这个组件安装上,那么就会导致在使用程序的时候无法使用Oracle客户端驱动问题,弥补的办法就是重新下载客户端程序. ...
- raw格式和qcow2格式
Raw: "raw" 镜像格式是最最简单的,并且是被 KVM 和 Xen 原生支持的格式,你 可以想象裸格式镜像和块设备文件是二进制位相当的,就好像从块设备拷 贝过来的,比方说,使 ...
- java.sql.SQLException: com.mysql.jdbc.Driver
项目本来是 oracle 驱动 + druid 数据源配置,现在要修改为 mysql+druid数据源配置 启动项目的时候报:java.sql.SQLException: com.mysql.jdbc ...
- mysql中表里的数据重新设置自增的id的方法
如果删除表数据用这个 TRUNCATE TABLE tablename 如果不删除表 alter table table_name AUTO_INCREMENT=;
- 如何消除“为帮助保护您的安全,Internet Explorer 已经限制此文件显示可能访问您计算机
如何消除“为帮助保护您的安全,Internet Explorer 已经限制此文件显示可能访问您计算机的活动内容.单击此处查看选项...”每次打开都出现警告音,可以打开浏览器的工具--> Inte ...