Stack设计与实现

Stack基本概念

栈是一种 特殊的线性表

栈仅能在线性表的一端进行操作

栈顶(Top):允许操作的一端

栈底(Bottom):不允许操作的一端

Stack的常用操作

创建栈

销毁栈

清空栈

进栈

出栈

获取栈顶元素

获取栈的大小

 

C语言描述=====》栈的设计与实现 人生财富库积累

#ifndef _MY_STACK_H_

#define _MY_STACK_H_

 

typedef
void Stack;

 

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
//_MY_STACK_H_

 

栈的顺序存储设计与实现

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
<stdio.h>
int main() { int a[4][4]; int (*p)[4]; p = a[0]; return 0;

算法思路

从第一个字符开始扫描

当遇见普通字符时忽略,当遇见左符号时压入栈中

当遇见右符号时从栈中弹出栈顶符号,并进行匹配

匹配成功:继续读入下一个字符

匹配失败:立即停止,并报错

结束:

成功: 所有字符扫描完毕,且栈为空

失败:匹配失败或所有字符扫描完毕但栈非空

当需要检测成对出现但又互不相邻的事物时

可以使用栈"后进先出"的特性

栈非常适合于需要"就近匹配"的场合

 

计算机的本质工作就是做数学运算,那计算机可以读入字符串

"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的更多相关文章

  1. 数据结构-Stack和Queue

    实现: #include "c2_list.h" template <typename object> class Stack{ public: bool isEmpt ...

  2. Stack的三种含义

    作者: 阮一峰 日期: 2013年11月29日 学习编程的时候,经常会看到stack这个词,它的中文名字叫做"栈". 理解这个概念,对于理解程序的运行至关重要.容易混淆的是,这个词 ...

  3. SPL标准库常用的数据结构

    栈数据结构 $stack = new SplStack(); //栈数据结构->先进后出 2 $stack->push('data1'); //入栈 $stack->push('da ...

  4. STL总结之queue, priority_queue, stack

    之所以把这三个容器放在一起,是因为他们都是容器适配器.   STL中queue就是我们常用的FIFO队列,实现是一个容器适配器,这种数据结构在网络中经常使用.   queue的模板声明: templa ...

  5. 数据结构算法集---C++语言实现

    //数据结构算法集---C++语言实现 //各种类都使用模版设计,可以对各种数据类型操作(整形,字符,浮点) /////////////////////////// // // // 堆栈数据结构 s ...

  6. Stack的三种含义(数据超过栈的大小,就发生stack overflow)

    非常典型的基础知识,转自http://www.ruanyifeng.com/blog/2013/11/stack.html 学习编程的时候,经常会看到stack这个词,它的中文名字叫做"栈& ...

  7. Stack的三种含义(转载--阮一峰)

    作者: 阮一峰 学习编程的时候,经常会看到stack这个词,它的中文名字叫做"栈". 理解这个概念,对于理解程序的运行至关重要.容易混淆的是,这个词其实有三种含义,适用于不同的场合 ...

  8. Stack栈的三种含义

    理解stack栈对于理解程序的执行至关重要.easy混淆的是,这个词事实上有三种含义,适用于不同的场合,必须加以区分. 含义一:数据结构 stack的第一种含义是一组数据的存放方式,特点为LIFO,即 ...

  9. [转帖]Stack的三种含义

    Stack的三种含义 http://www.ruanyifeng.com/blog/2013/11/stack.html 学习编程的时候,经常会看到stack这个词,它的中文名字叫做"栈&q ...

  10. Java堆(heap)、栈(stack)和队列的区别

    Java里面Stack有两种含义: 一:数据结构 Stack,即java.util.Stack import java.util.Stack; import java.util.Iterator; i ...

随机推荐

  1. 视角同步NewViewTarget

    SetViewTargetwithBlen说明: http://api.unrealengine.com/INT/BlueprintAPI/Game/Player/SetViewTargetwithB ...

  2. UE4 Socket多线程非阻塞通信

    转自:https://blog.csdn.net/lunweiwangxi3/article/details/50468593 ue4自带的Fsocket用起来依旧不是那么的顺手,感觉超出了我的理解范 ...

  3. Git及GitLab使用手册

    一.GitBash安装与使用 参考: https://www.cnblogs.com/jasonxu19900827/p/7823089.html 二.SourceTree安装与使用 SourceTr ...

  4. gulp 使用案例

    1.gulp 配置: // 引入 gulp var gulp = require('gulp'); var watch = require('gulp-watch'), //导入所有gulp需要的模块 ...

  5. Django跨域问题

    相关博客地址 同源策略与Jsonp 同源策略 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可 ...

  6. MySQL安装,库的操作

    一 数据库管理软件的由来 基于我们之前所学,数据要想永久保存,都是保存于文件中,毫无疑问,一个文件仅仅只能存在于某一台机器上. 如果我们暂且忽略直接基于文件来存取数据的效率问题,并且假设程序所有的组件 ...

  7. bzoj2961 共点圆 (CDQ分治, 凸包)

    /* 可以发现可行的圆心相对于我们要查询的点是在一个半平面上, 然后我们要做的就是动态维护凸壳然后用这个半平面去切它 看看是否是在合法的那一面 然后cdq分治就可以了 代码基本是抄的, */ #inc ...

  8. es6(10)--Set,Map(1)

    //Set { let list=new Set(); list.add(5);//添加 list.add(7); //属性size就是长度 console.log('size',list.size) ...

  9. 【Selenium-WebDriver自学】Selenium测试设计技术(十三)

    Selenium页面对象模型 1.Selenium页面对象模型 优点 页面的对象模型是其中测试对象和功能被彼此分开,从而保持代码干净的实现. 对象保持独立的测试脚本.一个目的可以通过一个或多个测试脚本 ...

  10. SecureCRT连接linux,Hive中无法使用删除键