一、stack的三种解释

stack有三种解释,我个人理解如下。

1、用户自定义的stack

用户自定义的stack就是一般意义上的后进先出队列,从名字上就能理解了,stack由下向上增长,有一个顶指针,一般来说有push,pop,top和isempty方法,具体的后面代码会展示。

2、程序的call stack

这个是程序运行时候的机制,我个人理解就是程序遇到一个call的时候,因为要跳转,所以需要把当前状态压栈。如果学过汇编的话可能好理解一点,简单说就是因为寄存器数量有限,所以每次只能保存当前的状态,那么跳转时候就需要把当前状态存起来然后切换到跳转后function的状态,然后等function return的时候再恢复到call之前的状态。这种形式也叫stack,因为如果有多重call的话,会有一个类似后进先出的队列来保存所有层的状态,然后return的时候一层一层恢复。

3、程序的数据区

程序有两个数据区,stack和heap。stack里面存放的是可以确定大小的数据,比如int,char。heap存放的是不能确定大小的数据,比如一个对象。每个线程有独立stack,但是一个进程只有一个heap。

二、代码演示

看代码:

/*
* File: main.cpp
* Author: ubuntu
*
* Created on 2013年12月10日, 下午4:00
*/ #include <cstdlib>
#include <iostream> using namespace std; class Test1{
private:
string stack[];
int head;
public:
Test1(){
head = ;
}
void push(string input){
stack[head] = input;
head++;
}
string pop(){
if (head >= ){
head--;
return stack[head];
}
}
string top(){
if (head > ){
return stack[head-];
}
}
bool isempty(){
if (head > ){
return true;
}
else{
return false;
}
}
}; class Student{
private:
int age;
string name; public:
Student(int Age, string Name)
{
age = Age;
setName(Name);
cout<<"I will be finished second! "<<endl;
}
void setName(string Name)
{
cout<<"I will be finished first!"<<endl;
name = Name;
}
}; /*
*
*/
int main(int argc, char** argv) {
Test1 stack;
cout<<stack.isempty()<<endl;
stack.push("");
stack.push("asd");
cout<<stack.top()<<endl;
cout<<stack.pop()<<endl;
cout<<stack.top()<<endl;
cout<<stack.isempty()<<endl; Student s = Student(,"Jonh");
cout<<"I will be finished third!"<<endl; int a = ;
int b = ;
string *c = new string("test");
cout<<&a<<endl;
cout<<&b<<endl;
cout<<&c<<endl;
cout<<c<<endl;
return ;
}

我是用c++来写的。

输出如下:

asd
asd I will be finished first!
I will be finished second!
I will be finished third!
0xbfb81d90
0xbfb81d94
0xbfb81d98
0x8d10050

Test1对应stack的第一种解释,可以看到实现了push,pop,top和isempty这四个方法,main当中也有演示。

Student对应stack的第二种解释,可以通过输出看到确实是最后的一个call最先完成。

a,b,c对应stack的第三种解释,通过输出可以看到,a、b、c三个指针的地址是相邻的,但是c当中存储的string的地址却相差很远。可以看出确实有stack和heap之分。

三、总结

要说stack其实也不是第一次听说了,不过系统的来学习stack确实是第一次,比如线程进程的stack和heap的问题之前就不太清楚。

学习总会有收获,只是多少的问题。

[课程相关]附加题——stack的理解的更多相关文章

  1. 附加题-stack的理解

    这次的附加题推荐的博客是http://www.ruanyifeng.com/blog/2013/11/stack.html阮一峰的,感觉讲的深入浅出,比较适合对计算机刚刚接触的人: 下面谈谈感想: 这 ...

  2. 阿里巴巴集团2016校园招聘-Python工程师笔试题(附加题+部分答案)

    前言 第一次网上笔试,被虐的很惨.一是不太习惯,最主要的是还是自己对Python的掌握,还不够熟练.下面是这次阿里笔试相关信息 笔试时间是,2015年8月23日,10:00——12:00 对于笔试题, ...

  3. 《剑指Offer》附加题_用两个队列实现一个栈_C++版

    在<剑指Offer>中,在栈和队列习题中,作者留下来一道题目供读者自己实现,即"用两个队列实现一个栈". 在计算机数据结构中,栈的特点是后进先出,即最后被压入(push ...

  4. 第五周课后作业——热门软件创新分析+附加题1&附加题3

    鉴于我们寝室都热衷于手游,所以本次热门软件创新分析我就来分析一下几款热门的抽卡型手游.   阴阳师(后文简称YYS)——剧情画风唯美,配音引人入胜 作为网易公司研发的一款3D日式和风回合制游戏,YYS ...

  5. PairProject 电梯调度 【附加题】

    [附加题] 改进电梯调度的interface 设计, 让它更好地反映现实, 更能让学生练习算法, 更好地实现信息隐藏和信息共享. 目前的设计有什么缺点, 你会如何改进它? 1.之前判断电梯是否闲置的函 ...

  6. 【SE】Week3 : 四则运算式生成评分工具Extension&Release Version(附加题)

    [附加题]第四阶段目标 - 界面模块,测试模块和核心模块的松耦合. 写到这里我只想吐槽一句,哪天我能写出功能复杂且真正松耦合的模块,我应该就不用写代码了吧[手动再见.. 当然这只是强调下松耦合和代码复 ...

  7. 《基于Cortex-M4的ucOS-III的应用》课程设计 结题报告

    <基于Cortex-M4的ucOS-III的应用>课程设计 结题报告 小组成员姓名:20155211 解雪莹 20155217 杨笛 20155227 辜彦霖 指导教师:娄嘉鹏 一.设计方 ...

  8. [课程相关]homework-09

    零.前言 这次的作业比较特殊,有两种做法.由于我对网页很熟悉,所以选择网页. 细节不赘述,下面写一下这次作业的几个亮点. 一.亮点 最大的亮点就是这个页面是纯客户端的,没有服务端.也就是说所有功能都是 ...

  9. 软件工程 --- Pair Project: Elevator Scheduler [电梯调度算法的实现和测试] [附加题]

    软件工程 --- Pair Project: Elevator Scheduler [电梯调度算法的实现和测试] [附加题] 首先,在分组之前,我和室友薛亚杰已经详细阅读了往届学长的博客,认为电梯调度 ...

随机推荐

  1. 在ASP.NET MVC中验证checkbox 必须选中 (Validation of required checkbox in Asp.Net MVC)

    转载自 http://blog.degree.no/2012/03/validation-of-required-checkbox-in-asp-net-mvc/ Why would you want ...

  2. 用vagrant搭建一个自己的lnmp环境(一)

    用vagrant搭建自己的lnmp环境 1.工具: a.vagrant b.virtual box c.linux服务器box(此处我使用centos 7.0) 2.安装完vagrant和virtua ...

  3. Linux内核完全注释之编程语言和环境(一)

    as86汇编器 1.来源与对于linux的用途 as86来源minix-386开发的intel 8086.80386汇编编译程序和链接程序,他主要为linux创建16位的启动引导扇区程序boot/bo ...

  4. Javascript(JS)对Cookie的读取、删除、写入操作帮助方法

    var CookieUtils = { get: function (name) { var cookieName = encodeURIComponent(name) + '=', cookieSt ...

  5. Oracle数据库多语言文字存储解决方案

    一.关于字符集 字符集(也称字元集,Character Set)就是字符编码表(codepage),一个字符不论英文.中文.韩文等在计算机系统内存或硬盘中通过二进制的字节(Byte)保存,这个二进制的 ...

  6. cdoj 26 遮挡判断(shadow) 水题

    遮挡判断(shadow) Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/26 ...

  7. uoj #118. 【UR #8】赴京赶考 水题

    #118. [UR #8]赴京赶考 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/118 Description ...

  8. ExtJS grid tableGrid study

    Q:  How to color the text in the grid Try: http://dev.sencha.com/playpen/docs/output/Ext.grid.TableG ...

  9. .cmd文件不小心管理记事本打开的恢复

    比如不小心将.cmd文件关联成用记事本打开了,此时须要删除注冊表: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explor ...

  10. iOS开发——UI篇Swift篇&UIAlertView/UIActionSheet

    UIAlertView/UIActionSheet UIAlertView //一个按钮的提醒 @IBAction func oneButtonAler() { //创建单一按钮提醒视图 let on ...