• 栈的基本操作


    由于c语言中没有bool类型,所以可以自己定义一个bool类型

    1. #define true 1
    2. #define false 0

    栈的结构体

    1. typedef struct {
    2. int data[maxsize];
    3. int top;
    4. } sqstack;

    初始化栈

    1. int initstack(sqstack* s)//初始化栈
    2. {
    3. s->top = -1;
    4. return true;
    5. }

    栈的判空操作

    1. int stackempty(sqstack* s)//栈判空
    2. {
    3. if (s->top == -1)
    4. return true;
    5. else
    6. return false;
    7. }

    栈的进栈操作

    1. int push(sqstack* s, int x)//进栈操作
    2. {
    3. if (s->top == maxsize - 1)
    4. return false;
    5. s->top++;
    6. s->data[s->top] = x;
    7. return true;
    8. }

    栈的出栈操作

    1. int pop(sqstack* s, int* x)//出栈操作
    2. {
    3. if (s->top == -1)
    4. return false;
    5. *x = s->data[s->top];
    6. s->top--;
    7. return true;
    8. }

    读取栈顶元素

    1. int gettop(sqstack* s, int* x)//读取栈顶元素
    2. {
    3. if (s->top == -1)
    4. return false;
    5. *x = s->data[s->top];
    6. return true;
    7. }

    完整的测试代码

    1. #define maxsize 10
    2. #define true 1
    3. #define false 0
    4. typedef struct {
    5. int data[maxsize];
    6. int top;
    7. } sqstack;
    8. int initstack(sqstack* s)//初始化栈
    9. {
    10. s->top = -1;
    11. return true;
    12. }
    13. int stackempty(sqstack* s)//栈判空
    14. {
    15. if (s->top == -1)
    16. return true;
    17. else
    18. return false;
    19. }
    20. int push(sqstack* s, int x)//进栈操作
    21. {
    22. if (s->top == maxsize - 1)
    23. return false;
    24. s->top++;
    25. s->data[s->top] = x;
    26. return true;
    27. }
    28. int pop(sqstack* s, int* x)//出栈操作
    29. {
    30. if (s->top == -1)
    31. return false;
    32. *x = s->data[s->top];
    33. s->top--;
    34. return true;
    35. }
    36. int gettop(sqstack* s, int* x)//读取栈顶元素
    37. {
    38. if (s->top == -1)
    39. return false;
    40. *x = s->data[s->top];
    41. return true;
    42. }
    43. #include
    44. int main() {
    45. sqstack s;
    46. initstack(&s); //初始化栈
    47. if (!stackempty(&s)) //栈判空
    48. printf("栈不为空\n");
    49. else
    50. printf("栈为空\n");
    51. int x = 0;
    52. printf("要进栈的元素为:");
    53. scanf("%d", &x);
    54. if (push(&s, x)) //进栈操作
    55. printf("进栈元素为%d\n", x);
    56. else
    57. printf("栈满,不能进栈%d\n", x);
    58. if (pop(&s, &x)) //出栈操作
    59. printf("出栈元素为%d\n", x);
    60. else
    61. printf("栈为空,不能出栈\n");
    62. printf("%d\n", x);
    63. if (gettop(&s, &x)) //获取栈顶元素操作
    64. printf("栈顶元素为%d\n", x);
    65. else
    66. printf("栈为空\n");
    67. return 0;
    68. }

    栈(stack)是一种线性结构,它具有的特性

    1. 后进先出(LIFO,Last In First Out):栈中元素的添加和删除都发生在同一端,称为栈顶。最后一个添加到栈中的元素将是第一个被删除的元素。
    2. 只能在栈顶进行插入和删除操作:这意味着栈的底部(栈底)到顶部(栈顶)的方向是固定的。
    3. 动态数据结构:栈可以根据需要创建和销毁。
    1. #include<stdio.h>
    2. #include<stdlib.h>
    3. #define MaxSize 5
    4. typedef struct sqstack
    5. {
    6. int data[MaxSize];
    7. int top;
    8. }sqstack;
    9. void initstack(sqstack* s)
    10. {
    11. s->top = -1;
    12. }
    13. int stackempty(sqstack* s)
    14. {
    15. if (s->top == -1)
    16. return 1;
    17. else
    18. return 0;
    19. }
    20. int push(sqstack* s,int x)
    21. {
    22. if (s->top == MaxSize - 1)
    23. {
    24. printf("栈满,%d无法进栈", x);
    25. return;
    26. }
    27. s->top = s->top + 1;
    28. s->data[s->top] = x;
    29. return 1;
    30. }
    31. int pop(sqstack* s)
    32. {
    33. if (s->top == -1)
    34. return 0;
    35. return s->data[s->top--];;
    36. }
    37. int gettop(sqstack* s,int x)
    38. {
    39. if (s->top == -1)
    40. {
    41. printf("栈空");
    42. return;
    43. }
    44. return s->data[s->top];
    45. }
    46. int main()
    47. {
    48. sqstack s;
    49. initstack(&s);
    50. stackempty(&s);
    51. int i = 0;
    52. int x = 0;
    53. printf("请输入进栈的元素:\n");
    54. for (i = 0; i < 6; i++)
    55. {
    56. scanf("%d", &x);
    57. push(&s, x);
    58. }
    59. printf("\n出栈的元素依次为");
    60. while (!stackempty(&s))
    61. {
    62. printf("%d ", pop(&s));
    63. }
    64. return 0;
    65. }

     

    从这段代码可以看出

    栈的最大容量为5,但是我依次输入了1,2,3,4,5,6,到6的时候,栈已经满了,所以不能再压入栈中。出栈的时候5后进入的,先出的栈。

    栈的应用

    将十进制转换为八进制

    1. #include <stdio.h>
    2. #define OK 1
    3. #define ERROR 0
    4. typedef int Status;
    5. #define MAXSIZE 100
    6. typedef struct
    7. {
    8. int* base;
    9. int* top;
    10. int stacksize;
    11. } SqStack;
    12. Status InitStack(SqStack* S)
    13. {
    14. S->base = (int*)malloc(sizeof(int) * MAXSIZE); //动态分配内存
    15. if (S->base ==NULL) {
    16. return ERROR; //内存分配失败,返回错误
    17. }
    18. S->top = S->base;
    19. S->stacksize = MAXSIZE;
    20. return OK;
    21. }
    22. Status Push(SqStack* S, int e)
    23. {
    24. if (S->top - S->base == S->stacksize) return ERROR;
    25. *S->top++ = e;
    26. return OK;
    27. }
    28. Status Pop(SqStack* S, int* e)
    29. {
    30. if (S->top == S->base) return ERROR;
    31. *e = *--S->top;
    32. return OK;
    33. }
    34. void conversion(int N)
    35. {
    36. int e;
    37. SqStack S;
    38. InitStack(&S);
    39. while (N)
    40. {
    41. Push(&S, N % 8);
    42. N = N / 8;
    43. }
    44. while (S.top != S.base)
    45. {
    46. Pop(&S, &e);
    47. printf("%d", e);
    48. }
    49. }
    50. int main()
    51. {
    52. int N;
    53. printf("请输入要转换的十进制整数:\n");
    54. scanf("%d", &N);
    55. printf("十进制整数%d转换成八进制数为:", N);
    56. if (N > 0)
    57. conversion(N);
    58. else if (N == 0)
    59. printf("0");
    60. else {
    61. printf("-");
    62. conversion(-N);
    63. }
    64. printf("\n");
    65. return 0;
    66. }

  • 相关阅读:
    【C++】list基本接口+手撕 list(详解迭代器)
    C++ Reference: Standard C++ Library reference: C Library: cmath: rint
    CREO:CREO软件之工程图界面的简介(图文教程)之详细攻略
    【HTML】重点知识内容~快速上手
    STM32开发(三十)STM32F103 数据手册 —— 模拟/数字转换 DAC 详解
    微信小程序——<image>图片组件图片显示闪烁
    Java 进阶知识--重拾者AIMING
    [附源码]计算机毕业设计springboot基于VUE的网上订餐系统
    【Acwing】最短路+二分 通信线路
    【unity】ComputeShader的学习使用
  • 原文地址:https://blog.csdn.net/m0_46702681/article/details/132948858