堆栈

c++句子逆序——堆栈实现

∥☆過路亽.° 提交于 2020-04-03 21:06:29
#include <stack> #include <string> using namespace std; int main() { stack<string> ss; string s; while (cin >> s) { ss.push(s); } while (!ss.empty()) { cout << ss.top(); ss.pop(); if (!ss.empty()) cout << ' '; } cout << endl; return 0; } 来源: https://www.cnblogs.com/xufeng123/p/12628865.html

c++(线性堆栈)

前提是你 提交于 2020-04-03 14:28:04
前面我们讲到了队列,今天我们接着讨论另外一种数据结构:堆栈。堆栈几乎是程序设计的命脉,没有堆栈就没有函数调用,当然也就没有软件设计。那么堆栈有什么特殊的属性呢?其实,堆栈的属性主要表现在下面两个方面: (1)堆栈的数据是先入后出 (2)堆栈的长度取决于栈顶的高度 那么,作为连续内存类型的堆栈应该怎么设计呢?大家可以自己先试一下: (1)设计堆栈节点 typedef struct _STACK_NODE { int* pData; int length; int top; }STACK_NODE; (2)创建堆栈 STACK_NODE* alloca_stack(int number) { STACK_NODE* pStackNode = NULL; if(0 == number) return NULL; pStackNode = (STACK_NODE*)malloc(sizeof(STACK_NODE)); assert(NULL != pStackNode); memset(pStackNode, 0, sizeof(STACK_NODE)); pStackNode->pData = (int*)malloc(sizeof(int) * number); if(NULL == pStackNode->pData){ free(pStackNode); return NULL;

VC++中出现stack overflow错误时修改VC++的默认堆栈大小

旧城冷巷雨未停 提交于 2020-03-31 03:53:28
  VC++中,在栈空间上申请存储的结构体或者类对象的数组空间时,如果数组长度过大,造成申请的栈空间超过或者逼近1MB时,程序可以编译通过,但是不能够执行起来。打到调试模式时会弹出如下图所示的栈空间越界错误对话框。 如下面的类定义: class Character { public: Character() { x0 = 0; y0 = 0; x1 = 0; y1 = 0; offsetX = 0; offsetY = 0; } unsigned int x0:10; unsigned int y0:10; unsigned int x1:10; unsigned int y1:10; unsigned int offsetX:8; unsigned int offsetY:8; unsigned int texIndex:8; };   而FreeTypeFont类中申请了65536个Character 类数组,如下代码: class FreeTypeFont { public: FT_Library _library; FT_Face _face; unsigned _sysFontTexture; Character _character[1<<16];    int _textureWidth; int _textureHeight; //! 临时变量

stack overflow错误分析

為{幸葍}努か 提交于 2020-03-31 03:52:23
stack overflow(堆栈溢出)就是不顾堆栈中分配的局部数据块大小,向该数据块写入了过多的数据,导致数据越界,结果覆盖了老的堆栈数据。 或者解释为 在长字符串中嵌入一段代码,并将过程的返回地址覆盖为这段代码的地址,这样当过程返回时,程序就转而开始执行这段自编的代码了。 比如如下这段程序: #include<stdio.h> int main() { char name[8]; printf("Please type your name:"); gets(name); printf("Hello.%s!",name); return 0; } 编译并且执行,输入ipxodiAAAAAAAAAAAAAAAA,执行完gets(name)之后,堆栈如下: 内存底部 内存顶部 name EBP ret <-------[ipxodiAA][AAAA][AAAA]............ ^&name 堆栈顶部 堆栈顶部 由于我们输入的name字符串太长,name数组容纳不下,只好向内存顶部继续写'A'。由于堆栈的生长方向与内存的生长方向相反,这些'A’覆盖了堆栈的老的元素。 'EBP ret’都被'A'覆盖了。在main返回的时候,就会把'AAAA'的ASCII码:0x41414141作为返回地址,CPU会试图执行0x41414141处的指令,结果出现错误。这就是一次堆栈溢出!

Queue<T>队列与Stack<T>堆栈

旧街凉风 提交于 2020-03-31 03:51:35
一、概述: Queue<T>队列,对象的先进先出集合(“FIFO”)。Stack<T>栈,对象的后进先出集合(”LIFO”)。 Queue<T>、Stack<T>类似于List<T>,但 Queue<T>没有IList<T>,所以不能用索引访问队列。也没有实现ICollection<T>,无Add,Remove等方法。 二、操作 入队列:Enqueue() Queue<string> nums = new Queue<string>(); nums.Enqueue("one"); nums.Enqueue("two"); nums.Enqueue("three"); 入栈:Push() Stack<string> nums = new Stack<string>(); nums.Push("one"); nums.Push("two"); nums.Push("three"); 遍历:队列最先返回最先进的,栈最先返回最后进的元素。 foreach (var num in nums)//队列依次返回,one,two,three ;栈依次返回:three,two,one, { Console.WriteLine(num); } 出队列:Dequeue()返回最先进的元素。 Console.WriteLine(nums.Dequeue());//one 出栈:Pop()返回最后进的元素。

数据结构之堆栈

馋奶兔 提交于 2020-03-29 19:04:33
谈起堆栈,我想起兄弟。中国的汉语真是有意思,兄弟说的是弟,同理,堆栈,强调的是 栈 。栈是一种 受限的线性表 。我把数据结构的知识回顾下。 数据结构是数据之间的关系 。关系是普遍存在的。是不是有点哲学的味道。那么数据到底都有些什么关系呢?我们去银行办理业务,去坐车都需要排队,新生入学站成一排军训,如果我们把人看作数据,那么此时的人和人的位置关系,便是线性的。除了 线性结构 ,还有什么结构呢?四世同堂的老人,他们一家人的血缘关系,如同一棵树。这便是 树型结构 。还有一种网状的结构,称为 图 ,如城市的交通网。字典属于什么数据结构?它不是树,不是图,那它属于线性结构吗? 字典 显然是个 集合 ,如果字典的key是线性关系,例如从1开始的编号,或者是a-z的字母,那么它能称得上线性关系吗?线性表是一种有限序列的集合。它是有顺序的。字典的数据项完全没有任何逻辑,它只与key有关系。 说了这么多,总结一下:数据之间的关系分为两种,逻辑关系和非逻辑关系如图所示: 今天我要说的栈是一种物理结构,它存储了一组线性元素,这组元素在 操作 上有 后进先出 的特性。因此可以看出, 数据结构不仅研究数据之间的关系,以及存储,而且包括数据的操作。 结构决定功能 ,正是有了栈这样的存储结构,因此,元素的操作上才有自己的特性。 接下来,我们看一个栈具体应用的例子:有一组有序数字

Windows 内存管理

允我心安 提交于 2020-03-29 03:53:38
1 . Windows 的内存结构 Windows 系统中的每个进程都被赋予它自己的虚拟地址空间。对于 32 位进程来说,这个地址空间是 4GB ,因为 32 位指针可以拥有从 0x00000000 至 0xFFFFFFFF 之间的任何一个值。对于 64 位进程来说,则这个空间是 16EB 。由于每个进程可以接收它自己的私有的地址空间,因此当进程中的一个线程正在运行时,该线程也只能访问只属于它的进程的内存。属于所有其他进程的内存则隐藏着,并且不能被访问。 每个进程的虚拟地址空间都要划分成各个分区,地址空间的分区时根据操作系统的基本实现来进行的,不同的 windows 内核,其分区也略有不同。下面以 32 位 windows 2000 (x86 和 alpha 处理器 ) 分区 地址范围 作用 NULL 指针分配的区域 0x00000000 为了帮助掌握 NULL 指针的分配情况,任何读写都将引发访问违规 0x0000FFFF 用户方式分区 0x00010000 这是进程的私有空间,该分区是维护进程的大部分数据的地方。 0x7FFEFFFF 64k 禁止进入分区 0x7FFF0000 这个分区是禁止进入的,任何访问都将是违规。保留此分区是为了更加容易地实现操作系统。怕用户内存越界到内核区。 0x7FFFFFFF 内核方式 0x80000000 这个分区是存放操作系统代码的地方

静态内存和堆栈

╄→гoц情女王★ 提交于 2020-03-28 05:40:25
一、内存基本构成 可编程内存在基本上分为这样的几大部分:静态存储区、堆区和栈区。他们的功能不同,对他们使用方式也就不同。 静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。 栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 堆区:亦称动态内存分配。程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在适当的时候用free或delete释放内存。动态内存的生存期可以由我们决定,如果我们不释放内存,程序将在最后才释放掉动态内存。 但是,良好的编程习惯是:如果某动态内存不再使用,需要将其释放掉,否则,我们认为发生了内存泄漏现象。 代码区:存放函数体的二进制代码 文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放 函数指针指向Code区,是程序运行的指令代码,数据指针指向Data,Heap,Stack区,是程序依赖以运行的各种数据 在文件作用域声明inline函数默认为static存储类型,const常量默认为static存储,如果加上extern,则为外部存储类型。 二、三者之间的区别 我们通过代码段来看看对这样的三部分内存需要怎样的操作和不同,以及应该注意怎样的地方

静态内存、动态内存与堆栈

五迷三道 提交于 2020-03-28 05:40:04
一、何谓静态内存、动态内存 静态内存分配好后,程序运行过程中一直存在不会被释放,且一旦分配好,其内存大小就固定下来不能改变,在编译和链接的阶段就会分配好。 动态内存是程序运行过程中,根据程序的需要分配和释放,其大小可变。 二、堆与栈 堆和栈都是动态分配的,区别有两点: 1、栈是由编译器分配与释放,堆是程序通过调用malloc或new分配,调用free或delete释放。 2、栈是线性结构,堆是链表结构。 三、使用场景 1、全局变量和static修饰的静态变量都存放在静态内存区。 2、函数内部定义的局部变量,存储在栈上,函数退出时,其占用内存被收回。 3、通过调用malloc或new得到的内存在堆上,不再需要时要显示的调用free或delete来释放,否则会造成内存泄漏,虽然有些操作系统会在程序退出后自动回收这部分内存,但还是要记住申请内存与释放内存成对操作,养成好习惯。 下面一段代码列举静态内存和动态内存的各种情形: //main.cpp int a = 0; //全局初始化区 ,静态内存 char *p1; //全局未初始化区 ,静态内存 main() { int b; //栈 char s[] = "abc"; //栈 char *p2; // 栈 char *p3 = "123456"; //"123456\0"在常量区,静态内存,p3在栈上。 static int c =0

Java如何打印异常的堆栈?

半城伤御伤魂 提交于 2020-03-27 22:12:54
在Java编程中,如何打印异常的堆栈? 此示例显示如何使用异常类的 printStack() 方法打印异常的堆栈。 package com.yiibai; public class PrintStackTrace { public static void main(String args[]) { int array[] = { 20, 20, 40 }; int num1 = 15, num2 = 10; int result = 10; try { result = num1 / num2; System.out.println("The result is" + result); for (int i = 5; i >= 0; i--) { System.out.println("The value of array is" + array[i]); } } catch (Exception e) { e.printStackTrace(); } } } Java 上述代码示例将产生以下结果 - The result is1 java.lang.ArrayIndexOutOfBoundsException: 5 at com.yiibai.PrintStackTrace.main(PrintStackTrace.java:13) Shell 示例-2