当前位置:   article > 正文

数据结构:栈的实现及应用场景_顺序栈和链栈的使用场景有哪些

顺序栈和链栈的使用场景有哪些

目录

 

一、栈

二、顺序栈的实现

​​​​​​三、链式栈的实现

四、栈的应用场景


一、栈

栈限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

栈所需要的一般功能:

  • 初始化栈
  • 栈是否为空(栈是否为满)
  • 入栈
  • 出栈
  • 遍历栈
  • 清空栈

栈的分类:

  • 顺序栈:存储核心是数组,在初始化就需要决定开辟栈空间的大小,在操作的时候需要注意栈空间是否有空余。
  • 链式栈:存储核心是链表,可以任意进行入栈与出栈操作

  • 个人对数据结构的一点理解

 ​​​​​​​

二、顺序栈的实现

  • 栈的定义
  1. /*栈的定义*/
  2. typedef struct stack
  3. {
  4. int *stack;//指向栈空间
  5. int size;//栈空间大小
  6. int top;//栈顶
  7. }stack, *stack_p;
  • 初始化
  1. /*初始化栈操作,n为需要开辟的空间*/
  2. *stack_p init_stack(int n)
  3. {
  4. stack_p sp = malloc(sizeof(stack));//堆空间
  5. if(sp == NULL)
  6. {
  7. printf("malloc failed\n");
  8. return sp;
  9. }
  10. sp->stack = calloc(n, sizeof(int));//分配n块数据
  11. sp->size = n;//n块数据域
  12. sp->top = -1;//没有存放任何数据 此时 栈顶=栈底
  13. return sp;
  14. }
  • 判断是否为空栈 与 是否为满栈
  1. /*判断栈是否为空*/
  2. bool isEmpty(stack_p sp)
  3. {
  4. return sp->top == -1;
  5. }
  6. /*判断栈是否存放满数据*/
  7. bool isFull(stack_p sp)
  8. {
  9. return sp->top >= sp->size -1;
  10. }
  • 入栈
  1. /*入栈操作, 参数为需要入栈的数据, 以及对应存放的栈*/
  2. bool push(int data, stack_p sp)
  3. {
  4. if(isFull(sp))//入栈前,判断栈空间是否满了
  5. {
  6. printf("stack is full of data\n");
  7. return false;
  8. }
  9. sp->top++;
  10. sp->stack[sp->top] = data;
  11. re
  • 出栈
  1. /*出栈操作*/
  2. bool pop(int *data, stack_p sp)
  3. {
  4. if(isEmpty(sp))//出站前,判断栈空间是否为空
  5. {
  6. printf("stack is empty\n");
  7. return false;
  8. }
  9. *data = sp->stack[sp->top];//先取值
  10. sp->top--;//栈顶往栈底方向移动
  11. return true;
  12. }
  • 遍历栈 与 清空栈
  1. /*显示栈空间中存放的数据*/
  2. void showStackData(stack_p sp)
  3. {
  4. if(isEmpty(sp))//显示前,判断栈是否为空
  5. {
  6. printf("sp is empty\n");
  7. return;
  8. }
  9. int pos;
  10. for(pos=0; pos<=sp->top; pos++)
  11. {
  12. printf("%d\t", sp->stack[pos]);
  13. }
  14. }
  15. /*清空栈*/
  16. void clearStack(stack_p sp)
  17. {
  18. free(sp->stack);
  19. }

​​​​​​三、链式栈的实现

  • 栈的定义与栈节点的定义
  1. /*定义栈存储节点 以及 栈(栈顶与栈底指针)*/
  2. typedef struct stack_Node
  3. {
  4. int data;
  5. struct stack_Node *next;
  6. }stackNode,*stackNode_p;
  7. typedef struct stack
  8. {
  9. stackNode_p top;//栈顶
  10. int size;//有多少个节点
  11. }stack,*stack_p;
  • 栈的初始化
  1. /*初始化栈*/
  2. stack_p init_stack()
  3. {
  4. stack_p sp = malloc(sizeof( stack));
  5. if (sp != NULL)
  6. {
  7. sp->top = NULL;
  8. sp->size = 0;
  9. }
  10. return sp;
  11. }
  • 判断栈是否为空
  1. /*判断栈是否为空*/
  2. bool isEmpty(stack_p sp)
  3. {
  4. return sp->size == 0;
  5. }
  • 入栈
  1. /*
  2. 入栈:输入需要入栈的数据
  3. (包含给对应数据创建栈存储节点,不含头结点)
  4. */
  5. void push(int data, stack_p sp)
  6. {
  7. //创建栈存储节点存放数据
  8. stackNode_p new = malloc(sizeof(stackNode));
  9. if(new != NULL)
  10. {
  11. new->data = data;
  12. //入栈处理
  13. new->next = sp->top;
  14. sp->top = new;
  15. sp->size++;
  16. }
  17. }
  • 出栈
  1. /*出栈*/
  2. bool pop(stack_p sp)
  3. {
  4. //判断栈是否为空
  5. if (isEmpty(sp))
  6. {
  7. printf("stack is empty\n");
  8. return false;
  9. }
  10. //出栈
  11. stackNode_p stNode_p = sp->top;
  12. sp->top = sp->top->next;
  13. sp->size--;
  14. //释放空间
  15. free(stNode_p);
  16. return true;
  17. }
  • 遍历栈
  1. /*遍历栈*/
  2. void showStack(stack_p sp)
  3. {
  4. //判断栈是否为空
  5. if (isEmpty(sp))
  6. {
  7. printf("stack is empty\n");
  8. return;
  9. }
  10. //从栈顶一直打印到栈底
  11. int pos;
  12. stackNode_p tmp = sp->top;
  13. for(pos=0; pos<sp->size; pos++)
  14. {
  15. printf("%d\t", tmp->data);
  16. tmp = tmp->next;
  17. }
  18. }
  • 清空栈
  1. /*清空栈*/
  2. bool clearStack(stack_p sp)
  3. {
  4. if (isEmpty(sp))
  5. {
  6. printf("stack is empty\n");
  7. return false;
  8. }
  9. int pos;
  10. int size = sp->size;//记录栈中总数量
  11. stackNode_p tmp;
  12. for(pos=0; pos<size; pos++)
  13. {
  14. //存储栈顶节点
  15. tmp = sp->top;
  16. //指向下一数据
  17. sp->top = tmp->next;
  18. sp->size--;
  19. //释放数据
  20. free(tmp);
  21. }
  22. return true;
  23. }

四、栈的应用场景

1、数制转换

  1. int main(int argc, char const *argv[])
  2. {
  3. int data;
  4. int tmp;
  5. stack_p sp = init_stack();
  6. //输入需要转换进制的数值
  7. printf("请输入需要转换成8进制数的10进制数值\n");
  8. scanf("%d",&data);
  9. while(data >0)
  10. {
  11. push(data%8,sp);//余数入栈
  12. data/=8;
  13. }
  14. while(1)
  15. {
  16. if (pop(&tmp,sp) != false)
  17. {
  18. printf("%d\t", tmp);
  19. }
  20. else break;
  21. }
  22. return 0;
  23. }

结果:

2、括号匹配

  1. int main(int argc, char const *argv[])
  2. {
  3. char data;
  4. char tmp_data;
  5. stack_p sp = init_stack();
  6. while(1)
  7. {
  8. printf("请输入需要入栈的括号\n");
  9. data = getchar();
  10. getchar();//吸收回车号
  11. switch(data)
  12. {
  13. //如果为左括号与左花括号则入栈
  14. case '(':
  15. case '{':
  16. push(data,sp);
  17. showStack(sp);
  18. break;
  19. case ')':
  20. case '}':
  21. pop(&tmp_data,sp);//当输入为右括号或者右花括号则出栈对比
  22. showStack(sp);
  23. if(data == ')')//将括号反转进行对比
  24. data = '(';
  25. else if (data == '}')
  26. data = '{';
  27. if (data == tmp_data)
  28. printf("匹配成功\n");
  29. else
  30. printf("匹配失败\n");
  31. break;
  32. }
  33. printf("\n");
  34. }
  35. return 0;
  36. }

 测试结果:

3、行编辑程序

  • 待补充

4、迷宫求解

  • 待补充

5、表达式求值

  • 待补充

6、运算符优先级

  • 待补充

7、递归

  • 待补充
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/557482
推荐阅读
相关标签
  

闽ICP备14008679号