• 数据结构之栈


    1:栈的结构体定义:

    1. typedef struct Satck{
    2. int* base;
    3. int top;
    4. int length;
    5. }Stack;
    6. //base记录的是栈的开辟的空间的首地址
    7. //栈的下标从0开始,top总是指在栈中已经存储的元素的下一个位置,由于栈是先进后出类型,
    8. //所以base所指的位置在已存储的元素的上边。刚开始栈为空,元素数为0所以栈的top指向0位置
    9. 因此top的大小也为栈存储的元素的数量
    10. //length则代表着栈最多的可以存储的元素的上限

    2:栈的初始化

    1. void InitStack(Stack &a){
    2. a.base=(int*)malloc(5*sizeof(int));
    3. a.length=5;
    4. a.top=0;
    5. }
    6. //由于我们要存储的是int类型的变量,所以我们开辟int类型的大小为5的空间,最大长度wei5
    7. 初始化后栈为空,所以top指向0

    3:判断栈是否为空

    1. bool isempty(Stack &a){
    2. if(a.top==0){
    3. return true;
    4. }
    5. return false;
    6. }
    7. //很简单看看top是否为0即可

    4:获取栈的已经存储的元素的数量

    1. int length(Stack &a){
    2. return a.top;
    3. }
    4. //top就是栈的已经存储的元素的数量

    5:入栈

    1. void offer(Stack &a,int b){
    2. if(a.top>=a.length){
    3. a.base=(int*)realloc(a.base,(a.length+5)*sizeof(int));
    4. a.length=a.length+5;
    5. }
    6. a.base[a.top]=b;
    7. a.top++;
    8. }//把元素b放进栈a里边的操作
    9. 首先我们要判断top是否已经到达我们开辟得到空间极限也就是top的大小是否已经到达length了,如果已经等于length我们再添加一个元素,top++的话,就已经超过我们开辟的空间大小,所以我们再top等于length时,来对栈进行扩容操作,如何操作呢,使用realloc函数来再源地址上进行扩容,会保护源地址的存储的元素不会丧失。
    10. realloc返回的和malloc一样,但是要传入的参数首先是原地址,其次是开辟的空间大小(在这里要加上源地址存储的空间大小)。
    11. 我们把元素存入top位置里边,然后top加加

    6:出栈

    1. void poll(Stack &a,int &dd){
    2. if(a.top==0){
    3. return;
    4. }
    5. a.top--;
    6. dd =a.base[a.top];
    7. }
    8. //首先在出栈前要先一步判断栈是否为空,如果为空栈就不需要出栈了,直接结束程序
    9. 否则top--出栈

    7:获取栈的栈顶元素但是不出栈

    1. void peek(Stack &a,int &dd){
    2. if(a.top==0){
    3. return;
    4. }
    5. dd=a.base[a.top-1];
    6. }//获取栈顶元素,首先判断栈是否为空,若是空,就不需要在再操作了,不为空,获取栈顶元素

    8:总代码以及样例展示

    1. #include
    2. using namespace std;
    3. typedef struct Satck{
    4. int* base;
    5. int top;
    6. int length;
    7. }Stack;
    8. void offer(Stack &a,int b){
    9. if(a.top>=a.length){
    10. a.base=(int*)realloc(a.base,(a.length+5)*sizeof(int));
    11. a.length=a.length+5;
    12. }
    13. a.base[a.top]=b;
    14. a.top++;
    15. }
    16. void poll(Stack &a,int &dd){
    17. if(a.top==0){
    18. return;
    19. }
    20. a.top--;
    21. dd =a.base[a.top];
    22. }
    23. void peek(Stack &a,int &dd){
    24. if(a.top==0){
    25. return;
    26. }
    27. dd=a.base[a.top-1];
    28. }
    29. bool isempty(Stack &a){
    30. if(a.top==0){
    31. return true;
    32. }
    33. return false;
    34. }
    35. int length(Stack &a){
    36. return a.top;
    37. }
    38. void InitStack(Stack &a){
    39. a.base=(int*)malloc(5*sizeof(int));
    40. a.length=5;
    41. a.top=0;
    42. }
    43. void test(){
    44. Stack ss;
    45. InitStack(ss);
    46. cout<<isempty(ss)<
    47. cout<<length(ss)<
    48. offer(ss,1);
    49. offer(ss,2);
    50. offer(ss,3);
    51. cout<0]<<" "<1]<<" "<2]<<" "<" "<
    52. int e;
    53. poll(ss,e);
    54. cout<" "<
    55. peek(ss,e);
    56. cout<" "<
    57. }
    58. int main(){
    59. test();
    60. return 0;
    61. }

  • 相关阅读:
    【JAVA】Spring 框架
    需求分析简介
    深度学习 --- stanford cs231 编程作业(assignment1,Q2: SVM分类器)
    MFC Windows 程序设计[122]之树形下拉列表框
    使用bisect模块进行二分查找操作 bisect.bisect()
    基于DotNetty实现自动发布 - 自动检测代码变化
    黑马C++ 03 提高5 —— STL常用容器_stack栈容器/queue队列容器/list链表容器
    C++中的多态
    硬核解析 MySQL 的 MVCC 实现原理,面试官看了都直呼内行
    科创人·数智思维私董会番外篇:思考需要私烤| 活动回顾
  • 原文地址:https://blog.csdn.net/m0_73862548/article/details/133243739