【计算机本科补全计划】王道单科--栈的实现以及一些性质

正文之前

这几天深受《C++ Primer》困扰,昨晚看拷贝构造函数以及析构函数那一块真是看到快哭了。所以今天找点别的看看,缓解下因为看不懂Primer的书籍而带来的不快感。自然而然的,当年为了考研买的王道单科《数据结构》成了我的首要对象。所以今日继续开始看王道,从第三章开始,先讲栈的一些细节。当然,等我复活了 我又会开始追《C++ Primer》开始怼,不过今天还是先算了吧。我需要勇气,可我没有梁静茹!

正文

1、 顺序存储实现栈

出于习惯,我还是采用指针传递对象的地址的方式通过函数对实参进行操作,引用其实也可以,不过为了方便大家的阅读,还是用指针吧!

#include <iostream>
using namespace std;
#define maxsize 20

typedef struct Stack
{
    int a[maxsize];
    int top;
} *pts;

void InitStack(pts ptrs)
{
    ptrs->top=-1;
    for(int i=0;i<20;++i)
        ptrs->a[i]=0;
}

void Push(pts ptrs,int item)
{
    //be care of the maxsize-1 because if top = maxsize - 1, it means that the stack is full,so that we cannot push any item into it .
    if(ptrs->top<maxsize-1)   
        ptrs->a[++ptrs->top]=item;
    else 
        {cout<<"The Stack is Full! Get out!"<<endl;return;};
}

int Pop(pts ptrs)
{
    if(ptrs->top!=-1)
        return ptrs->a[ptrs->top--];
    else 
    {
        cout<<"False ,the stack is empty!"<<endl;
        return 0;
    }
}


bool IsEmpty(pts ptrs)
{
    if(ptrs->top==-1)
    {
        cout<<"The Stack is Empty!!"<<endl;
        return false;
    }
    return true;
}

int main()
{
    pts test = new Stack;
    InitStack(test);
    bool emp=IsEmpty(test);
    if(!emp)
        cout<<"Please fill this Stack"<<endl;
    // but here we can use maxsize because we won't push any item into it,we just query the item of it . 
    for(int i=0;i<maxsize;++i)
        Push(test,i*(i/4)+i%3+3);
    // here the condition to stop is the ptes->top = -1, it means that the stack is empty.
    for(;test->top!=-1;)
        cout<<Pop(test)<<endl;
    delete(test);  // please remind this code because we don't use the shared_ptr,  so we should delete it by ourselves. 
    return 0;
}

上面是用顺序存储实现的,也就是数组,然后我搭配了指针用于传递地址,通过函数改变对象内容。如果要用引用的话,那也是可以的!都差不多,反正就是把具体的对象输入到函数中去,而不是用拷贝的局部变量来进行操作!至于链式存储,我猜大概就是在main函数中定义一个头指针,然后每一次push都会申请一个结构体的动态内存,然后再结合一系列的指针操作(头插法吧,直接把头结点当做栈顶指针好了),最后达到每次push进来的元素都在head指针下,至于另外的栈底,需要在第一次push的时候就准备好一个指针(或者就是判断next指针是否为空应该也行),以备后来pop到empty的用处。pop的话肯定就是head指针下移,然后注意要delete那个元素,不然就是野内存了!!

2、 我做王道的题目,有如下几个地方错了,给大家分享下:

1) 设链表不带头结点,且所有的的操作都在表头进行,则下列最不适合用来做链栈的是__?

A.只有表头结点指针,没有表尾指针的双向循环链表
B.只有表尾结点指针,没有表头指针的双向循环链表
C.只有表头结点指针,没有表尾指针的单向循环链表
D.只有表尾结点指针,没有表头指针的单向循环链表

【正确答案:C】 解析:我真是傻了!!!傻子!! 循环列表的话,要什么都不能只要表头,从表尾到表头只需要一步,而从表头到表尾则需要整个链表的长度,而在插入的操作中,我们不仅仅要在表头插入一个元素,还要把表尾的next指针指向新的元素!所以如果是表尾指针有的话,那就是O(1),如果是只有表头,那就是O(n)了!!傻逼啊我啊!!!

2) 向一个栈顶指针为top的链栈中插入一个x节点,那么下列语句是正确的是__?

A.top->next=x
B.x->next=top->next,top->next=x
C.x->next=top,top=x
D.x->next=top,top=top->next

【正确答案:C】 解析:我这个地方无语问苍天,我到底脑子烧了还是啥的?幸亏是不考研了?不然这样我自己都得哭死吧???😭!!!这种超low的错误!??好歹我的正确率也有21/25吧,居然把分丢在这种地方???蓝色part为实际操作过程,粉红色箭头代表着两个指针指向的对象。红色的箭头代表原有的指向!

3) 栈的初始状态为空,当字符序列“ n 1 ”作为对栈的输入序列的话,输出长度为3,可以作为C语言的标识符的输出序列有_?

A.4
B.5
C.3
D.6

【正确答案:C】 解析:好吧,这个地方,我要宣扬一个普世思想,那就是,加入我们按照升序输入某个序列,那么在输出序列的第一个元素之前的元素(比输出序列第一个元素小的)在后面输出的时候一定要按照输入顺序的逆序!!这个铁律,因为你的第一个元素都pop了,那么在此之前是没有pop操作的,所以这个item之前的元素肯定已经push 而且 没有pop了,那么按照先进后出的原则,一定有这个顺序的,只是这些元素输出的过程中是可以掺杂着其他元素的push 与 pop的,所以会有很多种可能,但是如果把这些元素剔除掉的话,一定还是按照逆序。所以,题目中有几种可能的输出:
1、 ## n 1 _ ##
2、 ## n _ 1 ##
3、 ## _ 1 n ##
4、 ## 1 n _ ##
5、 ## 1 _ n ##
五个,没错,不是排列组合的6个,因为 _ n 1 这个序列是不存在的。然后剔除掉数开头的,剩下三个可以作为C语言的标识符!!!答案是C: 3 个

还有一个题目懒得讲了,是概念性的错误,大家伙自个好好看书啊哈!

正文之后

差不多了,栈能讲的不多,而且那些要讲深的动辄就是几百行代码,我就偷个懒,大概把考研书籍中讲到的关于栈的一些知识点提炼出来了! 有兴趣的慢慢看。我有点困,先撤了!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,898评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,401评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,058评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,539评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,382评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,319评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,706评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,370评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,664评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,715评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,476评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,326评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,730评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,003评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,275评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,683评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,877评论 2 335

推荐阅读更多精彩内容