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. OpenStack单节点制作镜像

    1.创建快照 已修改后的时刻为记录,进行制作镜像,选择要制作镜像的虚拟机,点击创建快照,在所弹出的对话框中输入所创建的镜像名称 生成了一个镜像,类型为Snapshot 2.保存镜像 查看镜像列表 [r ...

  2. SAS 数据集生成map 文件

    OPTIONS NOCENTER PS=MAX LS=MAX; LIBNAME S '.'; DATA A;    INPUT X $ @@;    CARDS;A1 A2 A3 B1 B2 B3   ...

  3. python运算符&优先性

    (1)算数运算符:  +      -      *      /      //(求整)      %(求余)      ** (2)比较运算符:  >      <     >  ...

  4. crm 2016 tabstatechange event

    1 tabstatechange事件在窗体中定义 2 问题是如果选项卡默认为折叠的.且选项卡中包含了iFrame网页. 3 在网页内容加载完成之后,点击选项卡 折叠/展开 按钮, iFrame网页没有 ...

  5. POI操作Excel(二)

    注意:HSSFWorkBook对应2003版Excel      XSSFWorkBook对应2007以上的Excel 一.创建时间单元格 public void helloPoi3() throws ...

  6. Windows下 训练Tesseract实现识别图片中的文字

    介绍 Tesseract是一个基于Apache2.0协议开源的跨平台ocr引擎,支持多种语言的识别,在Windows和Linux上都有良好的支持. 源代码在这: 源码地址 有一个编译打包好的Windo ...

  7. (转)C# WebApi 身份认证解决方案:Basic基础认证

    原文地址:http://www.cnblogs.com/landeanfen/p/5287064.html 阅读目录 一.为什么需要身份认证 二.Basic基础认证的原理解析 1.常见的认证方式 2. ...

  8. react学习笔记(一)

    React的介绍: React来自于Facebook公司的开源项目 React 可以开发单页面应用 spa(单页面应用) react 组件化模块化 开发模式 React通过对DOM的模拟(虚拟dom) ...

  9. 用Python进行人脸识别

    本文的模型使用了C++工具箱 dlib 基于深度学习的最新人脸识别方法,基于户外脸部数据测试库Labeled Faces in the Wild 的基准水平来说,达到了99.38%的准确率. dlib ...

  10. java开发_""和null的区别

    转自:http://www.cnblogs.com/hongten/archive/2012/11/08/java_null.html#undefined 在代码中: 1 //name可以为" ...