【ThinkingInC++】26、下推栈(push_down stack)不会越出内存

头文件

/**
* 功能:下推栈(push_down stack)不会越出内存
* 时间:2014年8月18日08:13:36
* 作者:cutter_point
*/
#ifndef STACK_H_INCLUDED
#define STACK_H_INCLUDED

struct Stack
{
    struct Link
    {
        void* data; //这个结构的数据
        Link* next; //这个指向这种结构的指针
        void initialize(void* dat, Link* nxt);  //初始化这个结构,元素和next指向
    }*head;

    void initialize();
    void push(void* dat);
    void* peek();   //返回栈顶的元素,但是不删除这个元素
    void* pop();
    void cleanup();
};

#endif // STACK_H_INCLUDED

定义文件

/**
* 功能:下推栈(push_down stack)不会越出内存,定义
* 时间:2014年8月18日08:12:07
* 作者:cutter_point
*/

#include"Stack.h"
#include"../require.h"

using namespace std;

//struct link里面的额函数
//void initialize(void* dat, Link* nxt)  初始化这个结构,元素和next指向
void Stack::Link::initialize(void* dat, Link* nxt)
{
    data=dat;
    next=nxt;
}

//Stack里面的函数,初始化函数
//  void initialize();
void Stack::initialize(){head=nullptr;}

//    void push(void* dat);
void Stack::push(void* dat)
{
    Link* newLink=new Link;
    newLink->initialize(dat, head); //吧这个节点接到头结点前面
    head=newLink;   //重置头结点
}

//    void* peek();   //返回栈顶的元素,但是不删除这个元素
void* Stack::peek()
{
    require(head != 0, "Stack empty");
    return head->data;
}

//    void* pop();
void* Stack::pop()
{
    if(head == nullptr)
        return 0;
    void* result=head->data;
    Link* oldHead=head;
    head=head->next;
    delete oldHead;
    return result;
}

//    void cleanup();
void Stack::cleanup()
{
    require(head == nullptr, "Stack not empty");
}

测试文件

/**
* 功能:下推栈(push_down stack)不会越出内存,定义,测试
* 时间:2014年8月18日08:13:31
* 作者:cutter_point
*/

#include"Stack.h"
#include"Stack.cpp"
#include"../require.h"  //这个头文件是用直接给的,不是自己写的,不会用
#include<fstream>
#include<iostream>
#include<string>

using namespace std;

int main(int argc, char* argv[])    //argv[1]程序的路径名字
{
    //requireArgs(argc, 1); //这个有干扰作用
    //ifstream in(argv[1]);   //argv[1]程序的路径名字,这个在这里似乎不行
    ifstream in("StackTest.cpp");   //argv[1]程序的路径名字
    //assure(in, argv[1]);  //注释掉,反而可以运行
    Stack textlines;
    textlines.initialize();
    string line;
    //重文件中提取string
    while(getline(in, line))
        textlines.push(new string(line));   //存入链表中

    //取出输出来,逆序输出
    string* s;
    while((s=(string*)textlines.pop()) != 0)
    {
        cout<<*s<<endl;
        delete s;
    }

    textlines.cleanup();

    return 0;
}

【ThinkingInC++】26、下推栈(push_down stack)不会越出内存

时间: 2024-10-12 04:23:52

【ThinkingInC++】26、下推栈(push_down stack)不会越出内存的相关文章

下推栈实现(c++编程思想 p136)

1 头文件Stack.h 1 #ifndef STACK_H 2 #define STACK_H 3 4 struct Stack 5 { 6 7 struct Link 8 { 9 void* data; 10 Link* next; 11 void initialize(void* dat, Link* nxt); 12 }* head; 13 14 void initialize(); 15 void push(void* dat); 16 void* peek(); 17 void* p

从头认识java-9.8 栈(Stack)

这一章节我们来讨论一下栈(Stack). 1.特性 先进后出,当一个元素压进栈里面,他就会处于栈的底部,然后,另一个再压进来,盖在原来的元素上面,原来的元素想出去,只有等上面的元素先顶出栈才有机会. 2.方法演示 package com.ray.ch09; import java.util.Arrays; import java.util.Stack; public class Test { public static void main(String[] args) { Stack<Integ

Java异常的栈轨迹(Stack Trace)

捕获到异常时,往往需要进行一些处理.比较简单直接的方式就是打印异常栈轨迹Stack Trace.说起栈轨迹,可能很多人和我一样,第一反应就是printStackTrace()方法.其实除了这个方法,还有一些别的内容也是和栈轨迹有关的. 1.printStackTrace() 首先需要明确,这个方法并不是来自于Exception类.Exception类本身除了定义了几个构造器之外,所有的方法都是从其父类继承过来的.而和异常相关的方法都是从java.lang.Throwable类继承过来的.而pri

堆(heap)、栈(stack)、方法区(method)

JVM内存分为3个区:堆(heap).栈(stack).方法区(method) 1.堆(heap):存储的全部对象,每个对象有个与之对应的class信息.即通过new关键字和构造器创建的对象.JVM只有一个堆被所有线程共享.堆是垃圾收集管理的主要区域. 2.栈(stack):每个线程包含一个栈区,栈中只保存基本数据类型和自定义对象的引用.每个栈中的数据都是私有的,其他栈不能访问.栈又分为3个区:基本类 型变量区.执行环境上下文.操作指令区. 3.方法区(method):方法区又叫做静态区.和堆一

顺序栈——双栈(Dual Stack)

顺序栈--双栈(Dual Stack) 1. 双栈的概念 1.1 双栈的定义 双栈是指两个顺序栈,是一种特殊的顺序栈. 1.2 双栈中各元素的逻辑及存储关系 双栈共享一个地址连续的存储单元.即程序同时需要两个栈时,可以定义一个足够的栈空间,该空间的两端分别设为两个栈的栈底,用bottom[0]=-1和bottom[1]=maxSize指示. 压入数据时,让两个栈的栈顶top[0]和top[1]都向中间伸展,如果指示栈顶的指针top[0]+1等于另一个栈顶的指针top[1]时两栈已满. 每次进栈时

java数据结构与算法之栈(Stack)设计与实现

[版权申明]转载请注明出处(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/53362993 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) java数据结构与算法之栈设计与实现 ??本篇是jav

Java的堆(Heap)和栈(Stack)的区别

Java中的堆(Heap)是一个运行时数据区,用来存放类的对象:栈(Stack)主要存放基本的数据类型(int.char.double等8种基本数据类型)和对象句柄. 例1 int a=5; int b=5; System.out.println(a==b); 以上例子中,编译器首先处理int a=5,首先在栈中创建一个引用a,然后在栈中查找是否有5这个值,如果有,则将a指向5,如果没有,则创建一个5,再将a指向5.当处理int b=5时,由于栈中肯定已经存在5,直接将b指向5,这样a和b都指向

栈类Stack

Stack类是Vector类的子类.它向用户提供了堆栈这种高级的数据结构.栈的基本特性就是先进后出.即先放入栈中的元素将后被推出.Stack类中提供了相应方法完成栈的有关操作. 基本方法: public Object push(Object Hem) 将Hem压入栈中,Hem可以是任何类的对象. public Object pop() 弹出一个对象. public Object peek() 返回栈顶元素,但不弹出此元素. public int search(Object obj) 搜索对象ob

我理解的数据结构(二)—— 栈(Stack)

我理解的数据结构(二)-- 栈(Stack) 一.栈基础 栈是一种线性结构 相比较数组,栈对应的操作是数组的子集 只能从一端添加元素,也只能从同一端取出元素,这一端称为栈顶 栈是一种后进先出的数据结构,LIFO(Last In First Out) 二.栈的应用 Undo操作(撤销) 程序调用所使用的系统栈 三.栈的实现 其实,实现一个栈结构非常简单,我们只需要复用上一节我们自己封装的数组就可以快速的实现一个栈的创建.以数组的最后一个元素当成栈顶元素. 1. 首先,我们先创建一个栈的借口,里面声