栈、队列及循环队列

您所在的位置:网站首页 循环队列元素个数计算图解例子图片 栈、队列及循环队列

栈、队列及循环队列

2024-07-12 09:38| 来源: 网络整理| 查看: 265

  栈,队列及循环队列,是数据结构中的重要的且常用的内容,最近在学习数据结构,于是作一篇笔记记录一下,希望以后复习有帮助

  1.栈:

    栈是限定仅在表尾进行插入或删除操作的线性表。我们把表尾称作栈顶(top),相应的,表头称作栈底(bottom),由栈的特性可知,栈是一种后进先出(LIFO)的线性表,下面对栈的建立、基本操作及注意事项做一个说明:

栈的图示

    上图详细的勾勒出了栈的四种基本形态,通过观察我们知道,非空栈的top指针永远指向栈顶的后一位,并且base指针的位置保持不变,事实上,base指针除了在创建栈、扩容栈的时候被直接调用外,它都是不变的,这是因为我们不能直接对栈底元素进行操作,所以改变bese的指向之类的行为是毫无意义的。当我们注意看第四个图,发现栈已经满了,top指针溢出有效位置,实际上这种情况是不被允许的,对计算机随机位置的内存空间进行调用是不被推荐的,因此我们为了让栈保持功能,选择了对其进行扩容处理,就是在栈满时使用realloc()对其重新进行空间分配,确保不会有指针溢出的情况。

    基于上面的原理,我们不难想到实现思路:

    1.规定top、base指针,并确定栈的初始大小stacksize,将这三者封装为一个整体MyStack;

    2.初始化一个栈,使用malloc()动态分配空间,注意空间大小是stacksize × sizeof(ElemType),即元素类型大小×元素个数,并      将top和base指针同时指向这片空间的存储首地址;

    3.元素入栈先判断是否满栈,是就扩容,否就让元素入栈,并且让top指向下一个位置;

    4.元素出栈先判断是否空栈,是就退出,否就让元素出栈,并且让top指向上一个位置;

    5.元素空栈的充要条件是top = base; 满栈是top >= base+stacksize;

    6.清空栈即是让top = base; 销毁栈则是free(base),top = base =NULL;

    7.可以通过top指针来遍历栈;

    8.top - base的值即是栈长度;

  下面给出代码:

#include #include #define InitSize 100 //初始大小; #define DLC 10 //增量; using namespace std; typedef struct Stack { char *base; char *top; int stacksize; }MyStack; bool InitStack(MyStack &S) //初始化; { S.base = (char *)malloc(InitSize*sizeof (char)); if(!S.base) return false; //内存分配失败; S.top = S.base; S.stacksize = InitSize; return true; } bool IsEmpty(MyStack &S) //判空; { if(S.base == S.top) return true; return false; } bool IsFull(MyStack &S) //判满; { if(S.top >= S.base + S.stacksize) return true; else return false; } bool GetTop(MyStack &S,char &e) //取栈顶; { if(IsEmpty(S)) return false; e = *(S.top - 1); return true; } bool Push(MyStack &S,char e) //入栈; { if(IsFull(S)) { S.base = (char *)realloc(S.base,(S.stacksize + DLC)*sizeof(char)); if(!S.base) return false; S.stacksize += DLC; } *(S.top++) = e; return true; } bool Pop(MyStack &S,char &e) //出栈; { if(IsEmpty(S)) return false; e = *(--S.top); return true; } bool DestoryStack(MyStack S) //销毁; { free(S.base); S.top = S.base = NULL; S.stacksize = 0; return true; } bool ClearStack(MyStack &S) //清空; { S.top = S.base; return true; } bool Traverse(MyStack S) //遍历栈; { while(S.top > S.base) { cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3