栈的定义和基本算法库的建立

来源:互联网 发布:字有几个字节知乎 编辑:程序博客网 时间:2024/06/06 17:48

 概述:

今天晚上利用两个小时的时间把顺序栈和链栈的基本运算代码写了一遍,并且在过程中发现了注释颜色的问题,具体情况下面描述。

一、栈问题

顺序栈是和数组、顺序表有着惊人相似的一种存储方式,并且我猜数据结构学到这儿,大家可能对着几个名词有非常模糊的印象,具体反映就是:顺序表?不是线性表吗?数组?不是一个数据类型么?和顺序表有啥关系?栈和数组有啥关系? ······  因为以上都曾经是我的困惑。

首先 大家每次看一个章节视频的时候贺老师都会列出一张肥肠非常肥肠非常重要的图,我感觉类似于ds前几张的一个大体套路(只要套路深啊 ·····):


对就是它了,有没有发现顺序表、栈、数组在一个名叫数据的逻辑结构的分类线性结构下面,这就是他们的共同之处:都是线性结构!那线性表的概念我觉得都应该非常明了了,也就是说线性表只是一个抽象的类别(只是个类型)顺序表与链表则是是它具体的表现。而栈和队列测试限制了输入和输出后的顺序表。

而他们不的不同之处在哪儿呢?大家可以看到图片后面的数据的存储结构,这就是他们的不同,只不过图上写的太简括了,我个人感觉差别在:数组是顺序表和栈的基本实现方法(最底层),其次是顺序表数在数组上面加上了一点儿顺序逻辑的概念形成的新的概念,而栈则是基于顺序表的更具体的先进后出的逻辑实现。他们三个有点儿层层递进的感觉。


最后说一下套路吧:我感觉每一个逻辑结构都是以数据结构定义--初始化--空值判断--返回长度--输出,输入--释放为大体的过程。我发现这些后学栈其实没怎么看视频,就是从视频上看了函数头之后就把代码都自己写下来了,遇到bug再返回去看视频。然后学完后用一下经典的惯性思维是吧(很6的样子)!去想:我下次学队列的时候是不是也可以按这个思维去学习。再惯性一下!!想:我以后学习任何逻辑结构是不是都可以用这样的思维去理解和应用。 想到这儿感觉全世界的数据逻辑结构都在我手了。


好吧说了这么多,希望不是我自己明白就好。接下来附上顺序栈的算法库代码:

首先是是主函数:

/* *COPYRIGTH (c) 2017, YTU CS*All rigth reserve*作者:王铭泽*完成日期:2017.9.27*版本号:v1.0**问题描述:顺序栈的定义与基本算法库的建立。*/     #include <iostream>#include"Stack.h"using namespace std;int main(){   SqStack *p;   initStack(p);   Elemtype x[5]={'a','b','c','d','e'};   int i=0;   while(i<5)   {       PushStack(p,x[i++]);   }  DispStack1(p);  DestoryStack(p); return 0;}

接下来是头文件:

#ifndef STACK_H_INCLUDED#define STACK_H_INCLUDED#define Maxsize 20typedef char Elemtype;typedef struct{    Elemtype data[Maxsize];    int top;}SqStack;void initStack(SqStack *&s);//初始化栈。void DestoryStack(SqStack *&s);//释放栈。bool StackEmpty(SqStack *s);//判断栈是否为空。bool PushStack(SqStack *&s,Elemtype e);//进栈操作。bool PopStack(SqStack *&s,Elemtype &e);//出栈操作。bool GetTop(SqStack *s,Elemtype &e);//取栈顶元素。bool DispStack0(SqStack *s);//栈的数据输出。bool DispStack1(SqStack *s);//栈的实际输出#endif // STACK_H_INCLUDED

最后是函数的定义文件:

#include<malloc.h>#include"Stack.h"#include<iostream>using namespace std;void initStack(SqStack *&s)//初始化栈。{    s=(SqStack *)malloc(sizeof(SqStack));    s->top=-1;//令栈的top为-1表示空栈。}void DestoryStack(SqStack *&s)//释放栈。{    free(s);//顺序栈是一个单独的个体,只需要释放一次。}bool StackEmpty(SqStack *s)//判断栈是否为空。{    return (s->top==-1);//此句简明实用。}bool PushStack(SqStack *&s,Elemtype e)//进栈操作,注意进栈的时候只判断知否上溢。{   if(s->top==Maxsize-1)    return false;//空栈判断。感觉也可以用 s->top>=Maxsize-1.    s->data[++s->top]=e;    return true;}bool PopStack(SqStack *&s,Elemtype &e)//出栈操作。{    if(s->top==-1)//空栈判断      return false;      e=s->data[s->top--];      return true;}bool GetTop(SqStack *s,Elemtype &e)//取栈顶元素。{    if(s->top==-1)        return false;     e=s->data[s->top];     return true;}bool  DispStack0(SqStack *s)//栈数据的输出,定义为bool类型{    if(s->top==-1)        {            cout<<"This a empty Stack";          return false;        }    int i=s->top;    cout<<"This Stack is : ";    while(i!=-1)    {        cout<<"第"<<i+1<<"个数据: ";        cout<<s->data[i--]<<"   ";    }    cout<<endl;   return true;}bool DispStack1(SqStack *s)//栈的实际输出,定义为bool类型{    if(s->top==-1)        {            cout<<"This a empty Stack";          return false;        }    cout<<"This Stack is : ";    while(s->top!=-1)    {        cout<<"第"<<s->top+1<<"个数据: ";        cout<<s->data[s->top--]<<"   ";    }    cout<<endl;   return true;}
运行结果就不po了,不同的测试函数不同。


希望这篇文章对大家有用!

对了还有注释:由于我下的版本问题我的注释颜色是银···银····色。对就是那个放到代码后面需要瞪大着水汪汪的大眼睛去看的银色,大概是这样的:


就是这种感觉。

哎~放到图片里还挺容易看的。。。。。。


不过我想分享的就是 改代码注释颜色的方法:setting->Editor->Syntax->highlighting. 选择Comment line就是单行注释的颜色了,comment是多行注释 的颜色。

好了over