zoukankan      html  css  js  c++  java
  • 03_线性表应用一:栈

    一、什么是栈

    一种“先进后出”的数据结构;栈类似一个箱子, 先放进去后拿出来

    栈的分类:

    1.静态栈 : 以数组为内核的

    2.动态栈 : 以链表为内核

    栈的算法:

    出栈、压栈

    二、栈的顺序存储

    三、栈的链式存储

      1 #include<stdio.h>
      2 #include<stdlib.h>
      3 #include<malloc.h>
      4 //结点数据类型 
      5 typedef struct Node
      6 {
      7     int data;
      8     struct Node* pNext;
      9 }NODE,* PNODE;
     10 //栈数据类型   栈是一个砍掉一部分功能的链表 
     11 typedef struct Stack
     12 {
     13     PNODE pTop;
     14     PNODE pBottom;
     15 }STACK,* PSTACK;
     16 
     17 void init(PSTACK);
     18 void push(PSTACK pS,int val);
     19 void traverse(PSTACK);
     20 void pop(PSTACK);
     21 bool empty(PSTACK pS);
     22 
     23 int main(void)
     24 {
     25     STACK stack;
     26     init(&stack);
     27     push(&stack,1);
     28     push(&stack,2);
     29     push(&stack,3);
     30     push(&stack,4);
     31     push(&stack,5);
     32     push(&stack,6);
     33     traverse(&stack);
     34     pop(&stack);
     35 }
     36 
     37 void init(PSTACK pS)
     38 {
     39     pS->pTop = (PNODE)malloc(sizeof(NODE));
     40     if(NULL == pS->pTop)
     41     {
     42         printf("动态内存分配失败!");
     43         exit(-1); 
     44     }
     45     pS->pBottom = pS->pTop;
     46     pS->pTop->pNext = NULL;
     47 }
     48 
     49 void push(PSTACK pS,int val)
     50 {
     51     PNODE pTmp = (PNODE)malloc(sizeof(NODE));
     52     pTmp->data = val;
     53     
     54     pTmp->pNext  = pS->pTop;//把top给新结点 
     55     pS->pTop = pTmp;//新结点给top指向 
     56     return;
     57 }
     58 
     59 void traverse(PSTACK pS)
     60 {
     61     PNODE pTmp = pS->pTop; // 定义一个临时结点,永远指向顶点 
     62     while(pTmp != pS->pBottom) // 终止条件: pTmp != pBottom 
     63     {
     64         printf("pTmp->data : %d.
    ",pTmp->data);
     65         pTmp = pTmp->pNext; // 往下走 
     66     }
     67 }
     68 bool empty(PSTACK pS)
     69 {
     70     if(pS->pTop == pS->pBottom || pS->pTop->pNext == NULL)
     71     {
     72         return true;
     73     }
     74     return false;
     75 }
     76 void pop(PSTACK pS)
     77 {
     78     if(empty(pS))
     79     {
     80         printf("空栈"); 
     81         exit(-1);
     82     }
     83     while(pS->pTop != pS->pBottom)
     84     {
     85         PNODE pTmp = pS->pTop;
     86         printf("free pTmp->data: %d .
    " ,pTmp->data);
     87         pS->pTop = pTmp->pNext;
     88         free(pTmp);
     89         pTmp = NULL;
     90     }
     91     return;
     92 }
     93 
     94 //清空
     95 void clear(PSTACK pS)
     96 {
     97     if(empty(pS))
     98     {
     99         printf("空栈"); 
    100         exit(-1);
    101     }
    102     PNODE p = pS->pTop;
    103     PNODE q;
    104     while(p != pS->pBottom)
    105     {
    106         q = p->pNext;
    107         free(p);
    108         p = q;
    109     }
    110     pS->pTop = pS->pBottom;
    111 }

    四、栈的应用一:圆括号匹配

    五、栈的应用二:字符串回文判断

    六、栈和递归

    6.1  阶乘

    6.2  Fib数列

    七、哈诺塔实现

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 
     4 void hanoi(int i,char a,char b,char c); 
     5 int main(void)
     6 {
     7     char a = 'A';
     8     char b = 'B';
     9     char c = 'C'; 
    10     int i=0;
    11     printf("请输入盘子的个数:");
    12     scanf("%d",&i);
    13     hanoi(i,a,b,c); 
    14     return 0;
    15 }
    16 
    17 void hanoi(int i,char A,char B,char C)
    18 {
    19     if(i == 1)//如果是1个盘子
    20     {
    21         printf("将编号为%d的盘子直接从%c,移到%c
    ",i,A,C);//    直接将A上的盘子移到C
    22     }
    23     else//否则
    24     {
    25         
    26         hanoi(i - 1,A,C,B);//将A上的n-1个盘子借助C移到B
    27         printf("将编号为%d的盘子直接从%c,移到%c
    ",i,A,C);//将A上的盘子移到C
    28         hanoi(i - 1,B,A,C);//最后将B上的n-1个盘子借助A移到C
    29     }
    30      
    31 }
  • 相关阅读:
    转载的log4cplus使用指南
    linux下安装log4cplus
    MongoDB常用命令
    ios UIButton改背景
    ios发送邮件
    oracle数据库 in 结果字段的拆分
    Server returned HTTP response code: 505
    ORA-01795:列表中的最大表达式数为1000
    ajax post请求
    oracle 同义词
  • 原文地址:https://www.cnblogs.com/weihengblog/p/8322559.html
Copyright © 2011-2022 走看看