zoukankan      html  css  js  c++  java
  • 迎战下周自考数据结构实践科目

    编写完成重点数据结构和算法: 0.链表 1.栈 2.队列 3.二叉树数据结构和构建 4.前序中序后序遍历二叉树 5.构建哈夫曼树(最优二叉树) 6.图数据结构,图的深度优先遍历和广度优先遍历 7.拓扑排序 8.直接插入排序 9.希尔排序 10.希尔排序 11.冒泡排序 12.快速排序 13.直接选择排序 14.堆排序 15.归并排序 16.箱排序和基数排序 17.顺序查找,二分查找,索引顺序查找 

      1 // ExamTest.cpp : 定义控制台应用程序的入口点。
      2 //
      3 
      4 #include "stdafx.h"
      5 #include "stdlib.h"
      6 #include <string>
      7 /************************************************************************/
      8 /*                栈数据结构                                              */
      9 /************************************************************************/
     10 #define StackSize 1024    //栈大小
     11 typedef char DataType;
     12 typedef struct  
     13 {
     14     DataType data[StackSize];    //栈数组
     15     int top;    //栈顶索引
     16 }Stack;
     17 
     18 //清空栈
     19 void InitStack(Stack * s)
     20 {
     21     if(s == NULL)
     22         return;
     23     s->top = -1;
     24 }
     25 //判断是否满栈
     26 bool StatckEmpty(Stack* s)
     27 {
     28     if(s == NULL)
     29         return false;
     30     return s->top == StackSize-1;
     31 }
     32 //进栈
     33 void PushStack(Stack* s,DataType x)
     34 {
     35     if(s == NULL)
     36         return;
     37     if(StatckEmpty(s))
     38         return;
     39     else
     40     {
     41         //规定当前入栈完成后指向当前的数据
     42         s->top = s->top +1;
     43         s->data[s->top] = x;
     44     }
     45 }
     46 //出栈
     47 DataType PopStack(Stack* s)
     48 {
     49     if(s == NULL)
     50     {
     51         exit(0);
     52     }
     53     if(StatckEmpty(s))
     54     {
     55         printf("Stack is empty .
    ");
     56         exit(0);
     57     }
     58     else
     59     {
     60         return s->data[s->top--]; //先用后减
     61     }
     62 }
     63 
     64 //获取栈顶元素
     65 DataType GetTop(Stack* s)
     66 {
     67     if(s == NULL)
     68     {
     69         exit(0);
     70     }
     71     if(StatckEmpty(s))
     72     {
     73         printf("Stack empty . 
    ");
     74         exit(0);
     75     }
     76     else
     77     {
     78         return s->data[s->top];
     79     }
     80 }
     81 
     82 /************************************************************************/
     83 /*                队列数据结构(循环队列)                              */
     84 /************************************************************************/
     85 #define QUEUESIZE 1024
     86 typedef struct
     87 {
     88     DataType data[QUEUESIZE];    //队列数组
     89     int front;    //队列头
     90     int rear;    //队列尾部
     91 }Queue; 
     92 
     93 //初始化队列
     94 void InitQueue(Queue* q)
     95 {
     96     if(q == NULL)
     97         return;
     98     q->front = 0;
     99     q->rear = 0;
    100 }
    101 
    102 //判断栈是否为空
    103 bool QueueEmpty(Queue* q)
    104 {
    105     if(q == NULL)
    106         return false;
    107     else
    108         return q->front == q->rear;
    109 }
    110 
    111 //判断队列是否满
    112 bool QueueFull(Queue* q)
    113 {
    114     if(q == NULL)
    115         return false;
    116     return (q->rear + 1) % QUEUESIZE == q->front; 
    117 }
    118 
    119 //入队列
    120 void InsertQueue(Queue* q,DataType x)
    121 {
    122     if(q == NULL)
    123         return;
    124     if(QueueFull(q))
    125     {
    126         printf("Queue Full !
    ");
    127     }
    128     else
    129     {
    130         //队尾添加,队尾指向后面一个为空的
    131         q->data[q->rear] = x;
    132         q->rear = (q->rear + 1) % QUEUESIZE;
    133     }
    134 }
    135 
    136 //出队列
    137 DataType DelQueue(Queue* q)
    138 {
    139     DataType x;
    140     if(QueueEmpty(q))
    141     {
    142         printf("Queue is Empty 
    ");
    143         exit(0);
    144     }
    145     else
    146     {
    147         x = q->data[q->front];
    148         q->front = (q->front + 1) % QUEUESIZE;
    149         return x;
    150     }
    151 }
    152 
    153 //取队头元素
    154 DataType GetFrontData(Queue* q)
    155 {
    156     if(QueueEmpty(q))
    157     {
    158         printf("queue is empty!
    ");
    159         exit(0);
    160     }
    161     else
    162     {
    163         return q->data[q->front];
    164     }
    165 }
    166 
    167 //取队尾元素
    168 DataType GetRearData(Queue* q)
    169 {
    170     if(QueueEmpty(q))
    171     {
    172         printf("queue is empty !");
    173         exit(0);
    174     }
    175     else
    176     {
    177         return q->data[q->rear];
    178     }
    179 }
    180 /* 字符串匹配(判断一个子串是否是另一个字符串的子串)*/
    181 bool IsSubString()
    182 {
    183     char parentString[1024];
    184     char subString[1024];
    185     printf("please input parent string!
    ");
    186     scanf("%s",parentString);
    187     printf("please input sub string!
    ");
    188     scanf("%s",subString);
    189 
    190     int nParent = strlen(parentString);
    191     int nSub = strlen(subString);
    192     /*
    193         1. 如果子串的字符数量大于父串的数量则匹配失败
    194         2. 子串的数量大于父串的数量,匹配比较。
    195     */
    196     if(nSub > nParent)
    197         return false;
    198     for(int i = 0; i <= nParent; i++)
    199     {
    200         int k = i;
    201         if((nParent - k) < nSub)
    202             return false;
    203         for(int j = 0; j <= nSub; j++)
    204         {
    205             if(subString[j] == parentString[k])
    206             {
    207                 if(j == nSub -1)
    208                     return true;
    209                 k++;
    210             }
    211             else
    212             {
    213                 break;
    214             }
    215         }
    216     }
    217     return false;
    218 }
    219 typedef struct BinNode
    220 {
    221     DataType data;
    222     BinNode* lChild;
    223     BinNode* rChild;
    224 }BinNTree;
    225 
    226 typedef BinNode* BinTree;
    227 char* str = "ABDH#K###E##CFI###G#J##";
    228 //构造一个二叉树,使用前序创建,#表示对应的节点为NULL
    229 int index = 0;
    230 void creatBinTree(BinNTree** t)
    231 {
    232     if( (*t) = (BinNTree*) malloc(sizeof(BinNTree)))
    233     {
    234         char ch = str[index++];
    235         if(ch == '#')
    236         {
    237             (*t) = NULL;
    238             return;
    239         }
    240         (*t)->data = ch;
    241         creatBinTree(&(*t)->lChild);
    242         creatBinTree(&(*t)->rChild);
    243     }
    244 };
    245 
    246 //清空二叉树
    247 void clearBinTree(BinNTree* t)
    248 {
    249     if(t == NULL)
    250         return;
    251 
    252     if(t->lChild)
    253         clearBinTree(t->lChild);
    254     if(t->rChild)
    255         clearBinTree(t->rChild);
    256     free(t);
    257 }
    258 //求二叉树深度
    259 int getBinTreeDeep(BinNTree* & t)
    260 {
    261     int i = 0;
    262     int j = 0;
    263     if(!t)
    264         return 0;
    265     if(t->lChild)
    266         i = getBinTreeDeep(t->lChild);
    267     if(t->rChild)
    268         j = getBinTreeDeep(t->rChild);
    269     return i > j? i+1:j+1;
    270 }
    271 
    272 //前序遍历
    273 void preOrder(BinNTree* t)
    274 {
    275     if(t == NULL)
    276         return;
    277     printf("%c ",t->data);
    278     preOrder(t->lChild);
    279     preOrder(t->rChild);
    280 }
    281 
    282 //中序遍历
    283 void inOrder(BinNTree* t)
    284 {
    285     if(t == NULL)
    286         return;
    287     inOrder(t->lChild);
    288     printf("%c ",t->data);
    289     inOrder(t->rChild);
    290 }
    291 
    292 //后序遍历
    293 void postOrder(BinNTree* t)
    294 {
    295     if(t == NULL)
    296         return;
    297     postOrder(t->lChild);
    298     postOrder(t->rChild);
    299     printf("%c ",t->data);
    300 }
    301 
    302 //查找二叉树中是否存在某值
    303 bool find(BinNTree* t,DataType data)
    304 {
    305     if(t == NULL)
    306         return false;
    307     if(t->data == data)
    308         return true;
    309     if(find(t->lChild,data))
    310         return true;
    311     return find(t->rChild,data);
    312 
    313 }
    314 
    315 int _tmain(int argc, _TCHAR* argv[])
    316 {
    317     /*    // 字符串匹配函数测试
    318     while (1)
    319     {
    320         if(IsSubString())
    321         {
    322             printf("this is subString for parentString!
    ");
    323         }
    324         else
    325         {
    326             printf("sorry,this is not subString for parentString
    ");
    327         }
    328     }
    329     */
    330 
    331     /************************************************************************/
    332     /*            二叉树测试                                                  */
    333     /************************************************************************/
    334     BinTree t = NULL;
    335     creatBinTree(&t);
    336     int nDept = getBinTreeDeep(t);
    337     printf("this BinTree Depth is: %d
    ",nDept);
    338     printf("前序遍历结果:");
    339     preOrder(t);
    340     printf("
    后序遍历结果:");
    341     postOrder(t);
    342     printf("
    中序遍历结果:");
    343     inOrder(t);
    344     getchar();
    345 }
  • 相关阅读:
    gRPC初识
    Go操作MySQL
    Go语言操作Redis
    Markdown 教程
    Go操作MongoDB
    Go操作NSQ
    Go操作kafka
    Go操作etcd
    Go语言获取系统性能数据gopsutil库
    influxDB
  • 原文地址:https://www.cnblogs.com/sdnyzhl/p/4207446.html
Copyright © 2011-2022 走看看