数据结构之线性结构之堆栈

二,堆栈

 

中缀表达式:运算符位于两数之后; a+b*c-d/e

后缀表达式:运算符位于两数之后; abc*+de/-;计算机表示式求解时的读法;用堆栈实现计算

前缀表达式:运算符位于两数之前; -+a*bc/de

 

堆栈(操作受限制的线性表),先入后出,只在一端(栈顶,top)做插入和删除

push和pop为最常用的操作,可以交替进行;

栈的顺序存储实现:用数组实现堆栈

#define MAXSIZE 10
typedef struct {int Data[MAXSIZE];int Top;   //指向栈顶的位置
}Stack;

 

void Push(Stack *PtrS, int item)//item为待插入元素
{if (PtrS->Top == MAXSIZE){printf("堆栈满"); return;}else{PtrS->Data[++(PtrS->Top)] = item;//先把指向top的指针指向下一位,再往该位置插入数字return;}
}

 

int Pop(Stack *PtrS)
{if (PtrS->Top==-1){printf("栈为空");return -NAN;   //此处只要是特殊值,标志错误
    }else{return(PtrS->Data[(PtrS->Top)--]);//返回栈顶的值之后需要把栈顶的指针的值往下移动一位
    }
}

 

一个数组实现两个堆栈:一个指向数组头,一个指向数组尾部,当两个指针相邻时,数组满,即两头向中间生长

堆栈的链式存储实现

用链表表示堆栈,链栈,实际是个单链表。插入和删除操作只能在链栈的栈顶进行。即栈顶Top应该在链表的头,不能在尾部(单向链表只能找到下一项,找不到上一项)

typedef struct NodeStack {int Data;struct NodeStack *Next;
}LinkStack;void LinkPush(int item, LinkStack *S)
{LinkStack *temp = new LinkStack;temp->Data = item;temp->Next = S->Next;S->Next = temp;
}int LinkPop(LinkStack *S)
{LinkStack *temp = new LinkStack;int result;if (S->Next == NULL){printf("堆栈空");return NULL;}else{temp = S->Next;//删除某一个数时需要定位到该数之前的那个数S->Next = temp->Next;result = temp->Data;delete(temp);return result;}
}

中缀表达式转换成后缀表达式:堆栈实现,复杂度为n

  1. 运算数:直接输出;
  2. 左括号:压栈
  3. 右括号:输出栈顶元素,直到遇到左括号(出栈,不输出)
  4. 运算符:大于栈顶,压栈;小于等于栈顶,输出栈顶,比较新栈顶,循环,压栈;括号内的运算符依旧遵循此规则
  5. 堆栈存留一一输出

      小于等于栈顶时,栈顶输出

 

后缀表达式可以用堆栈求出其具体数值:

把运算数压入栈中,遇到运算符,取出栈顶两元素运算后的结果压入栈中,继续

堆栈其他作用:

  1. 函数调用及递归实现
  2. 深度优先搜索
  3. 回溯算法

转载于:https://www.cnblogs.com/xiaoxue126/p/9036568.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/465956.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt 开源作品 | 小伙子,给你的 Linux 系统写个 Launcher 吧

今天给大家分享一下:如何用 Qt 实现一个 launcher (程序启动器)。运行效果:github 链接:https://github.com/alamminsalo/qml-launcher代码很少,C 部分大约 100行代码。下面是实现过程。1. 创建 QML 应用在 Qt Creator 依次点击&a…

Sourcetail 一款代码编辑神器,让看源码如丝般顺滑

大家好,我是小麦,上一次的文章《一个超级实用的源码阅读小技巧》,我简单提到通过gccegyptgraphviz(dot)这三个工具,快速生成函数调用图,总体来说也非常好用。众所周知VSCode,Sorceinsight非常好用&#xff…

CPU占用率是什么?

这是昨晚上在朋友圈发的一个讨论回答的问题很多因为这个问题,我晚上也没早睡,就想把这个讲清楚说这个问题之前我们先了解下时间片调度算法,因为用这个来讲比较清楚。CPU可以执行任务,CPU给哪个进程执行,哪个进程就可以…

长大了,也弄丢了很多东西

小明要回家处理父亲的头七,那天晚上跟他喝酒聊天,我们说对生活的一些计划,比如计划让小孩上哪所小学,比如上小学了上哪所初中,高中,报什么课外兴趣班等等。吃过苦的孩子心里都有一种执念,想让自…

我的爹,我的娘(2006-02-22 21:39:07)(新浪)

爸爸妈妈是农民(我也是),都已年过半百。他们很忙碌,闲不下来.爸爸头发这几年越来越少了,头发也白了不少,但坚持经常染发,因为他说,怕我的小兄弟产生为什么别人爸爸这么年轻的想法。我…

200个模块,怎么用有线的方式进行组网通信

这是一个读者私聊我的问题,我觉得比较有意思,发出来大家一起讨论,我相信在讨论后,会有更加好的的方案。问题有200个模块,这200个模块需要和主CPU进行通信,每个模块的距离大概在30~50cm之间,用怎…

两招让陌生网络访问者现出原形

当我们关闭计算机时,经常出现“有一台计算机与你的电脑有连接,如果关闭将中断数据”的提示,尤其是在局域网中这种提示更是经常出现。其实这是因为别人通过网络正在访问自己电脑上的共享资源呢!面对如此恶劣的行动,难道只能任其胡作非为吗!当然…

网易创始人之一,周卓林先生

这篇文章的主人公我觉得对我们做技术的人非常有借鉴作用。大学的时候,我们老师就一直强调,一命,二运,三风水,四积德,五读书,后面我就不记得了。1、1997年2月,周卓林上Hotmail&#x…

用单片机制作简单的频率计

点击上方“果果小师弟”,选择“置顶/星标公众号”干货福利,第一时间送达!摘要:利用定时器产生PWM波。然后利用32的外部中断和定时器来测量32输出的波形 硬件:STM32F103C8T6核心板、示波器、串口调试助手 所用到的的引脚…

深入理解Linux内核之内核抢占

1.开场白环境:处理器架构:arm64内核源码:linux-5.11ubuntu版本:20.04.1代码阅读工具:vimctagscscope我们或许经常听说过内核抢占,可是我们是否真正理解它呢?内核抢占和抢占式内核究竟有什么关系…

Python+Selenium学习笔记10 - send_keys上传文件

在火狐浏览器上传文件 上传前,同一个HTML文件在火狐和Edge浏览器显示有些不同 这是Firefox浏览器的显示 这是Edge浏览器 上传后 1 # coding utf-82 3 from selenium import webdriver4 import os5 import time6 7 dr webdriver.Firefox()8 file_path "file:…

不错,又有东西可以领!顺带开发个炫彩灯

什么是涂鸦Arduino SDK?Arduino 是全球最流行的开源硬件平台,涂鸦官方推出的 Arduino 开发驱动库,使用任意 Arduino 开发板涂鸦通用模组即可快速实现设备联网,开发属于自己的 IoT 项目。本次实战营适合你吗?没基础 —— Arduino 开发需要掌…

GNS3从入门到精通

GNS3是一款优秀的具有图形化界面的模拟器。可以运行在多平台上(Windows,Linux,MacOS等)。其最大的特点就是搭建拓扑极其简单,且支持保存startup-config,供下次实验中继续导入使用,而且所有设备导…

Android App优化之ANR详解

引言 背景:Android App优化, 要怎么做?Android App优化之性能分析工具Android App优化之提升你的App启动速度之理论基础Android App优化之提升你的App启动速度之实例挑战Android App优化之Layout怎么摆Android App优化之ANR详解Android App优化之消除卡顿Android App优化之内存…

面试官让你用C语言实现大数相乘,慌吗?

在之前的笔试题解析里面,我写了大数相加的问题,这里再剖析一个大数相乘,顾名思义,大数相乘就是这个数已经大到最大的数据类型都没有办法保存了。我们看看最大的数据类型可以保存多大的数据。#include "stdio.h" #includ…

每周分享之cookie详解

本章从JS方向讲解cookie的使用。(实质上后端代码也是差不多用法,无非读取和设置两块) 基本用法:document.cookie"usernamepengpeng"; 修改的时候也是这句,重新赋值即可。 一般的,cookie是记域名的…

每天都用,但是你一定不知道麦克风的灵敏度是什么

我们讨论音频器件的时候,就不得不去讨论灵敏度,麦克风、喇叭、蜂鸣器这些器件都会涉及到灵敏度。灵敏度体现的是输出和输入的关系,因为和声音有关,我们必须要知道声压,理解灵敏度、测量灵敏度,并从中选择合…

邓总的vim配置,需要的自己拿走~

我比较喜欢直接用source insight看代码,不过邓总很喜欢用vim,今天特意让他整理了他的vim 配置,喜欢的同学可以自行下载。在公众号后台回复「vim」获取下载链接VIM 配置查看本机 VIM cscope ctagsvim Ubuntu自带,cscope 、ctags…

html嵌套html解决办法(object/object)

后台管理系统多用到了页面嵌套页面的场景&#xff0c;下面是我在工作中解决的方法&#xff0c;利用<object></object>的data属性&#xff0c;下面试w3c的介绍&#xff1a; data 属性用于指定供对象处理的数据文件的 URL。 该属性的值是文件的 URL&#xff0c;该 UR…

原来,我有这样期望

我妈小时候一直跟我们讲他们村里的一个人&#xff0c;我妈说他们家特有钱&#xff0c;他们家的粮仓里装满了花生和大米&#xff0c;而让他们变得这么富有的原因是—勤劳和省。我还上小学那几年&#xff0c;水稻的产量很低「袁隆平的杂交水稻是在后来几年才普及的」&#xff0c;…