• 5.队列实现,以及多线程对队列的插入进行操作


    queue.h

     1 #include <stdlib.h>
     2 #include <stdio.h>
     3 #include <Windows.h>
     4 
     5 #define N 100 //队列
     6 struct queue
     7 {
     8     int data[N];
     9     int head;//数据开头
    10     int back;//数据结尾
    11 };
    12 
    13 typedef struct queue Queue;
    14 
    15 
    16 void init(Queue *p);//初始化
    17 int isempty(Queue *p);//是否为空
    18 int isfull(Queue *p);//是否满
    19 
    20 void enQueue(Queue *p, int key);//入队
    21 int getlast(Queue *p);//获取最后一个元素
    22 void deQueue(Queue *p);//出队
    23 void show(Queue *p);//显示

    main.cpp

      1 #include "queue.h"
      2 #include <process.h>
      3 Queue myq;
      4 
      5 //多线程函数
      6 void run(void *p)
      7 {
      8     //线程编号
      9     int *px = (int *)p;
     10     printf("线程编号%d
    ", *px);
     11     //数据入队
     12     enQueue(&myq, *px);
     13 }
     14 
     15 void main()
     16 {
     17     int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
     18     for (int i = 0; i < 10; i++)
     19     {
     20         HANDLE mythread = (HANDLE)_beginthread(run, 0, &a[i]);
     21         //WaitForSingleObject(mythread,INFINITE);//等待
     22     }
     23     show(&myq);
     24     system("pause");
     25 }
     26 
     27 //测试队列的操作
     28 //void main()
     29 //{
     30 //    Queue myq;
     31 //    init(&myq);
     32 //    for (int i = 0; i < 10; i++)
     33 //    {
     34 //        enQueue(&myq, i);
     35 //        show(&myq);
     36 //    }
     37 //    
     38 //    while (!isempty(&myq))
     39 //    {
     40 //        printf("出队的值%d", getlast(&myq));
     41 //        deQueue(&myq);
     42 //        show(&myq);
     43 //    }
     44 //
     45 //    system("pause");
     46 //}
     47 
     48 //初始化队列
     49 void init(Queue *p)
     50 {
     51     p->head = p->back = 0;
     52     memset(p->data, 0, sizeof(int)*N);
     53 }
     54 
     55 //判断队列是否为空
     56 int isempty(Queue *p)
     57 {
     58     if (p->head == p->back)
     59     {
     60         return 1;
     61     }
     62     else
     63     {
     64         return 0;
     65     }
     66 }
     67 
     68 //判断队列是否满了
     69 int isfull(Queue *p)
     70 {
     71     if (p->back == N - 1)
     72     {
     73         return 1;
     74     }
     75     else
     76     {
     77         return 0;
     78     }
     79 }
     80 
     81 //入队操作
     82 void enQueue(Queue *p, int key)
     83 {
     84     if (isfull(p))
     85     {
     86         return;
     87     }
     88     else
     89     {
     90         if (isempty(p))
     91         {
     92             p->data[p->back] = key;
     93             p->back++;
     94         }
     95         else
     96         {
     97             for (int i = p->back - 1; i > 0; i--)
     98             {
     99                 p->data[i] = p->data[i-1];
    100             }
    101 
    102             p->data[0] = key;
    103             p->back++;
    104         }
    105     }
    106 }
    107 
    108 //获取队列最后一个元素
    109 int getlast(Queue *p)
    110 {
    111     return p->data[p->back - 1];
    112 }
    113 
    114 //出队
    115 void deQueue(Queue *p)
    116 {
    117     if (isempty(p))
    118     {
    119         return;
    120     }
    121     else
    122     {
    123         p->back--;
    124     }
    125 }
    126 
    127 //显示队列状态
    128 void show(Queue *p)
    129 {
    130     for (int i = 0; i < p->back; i++)
    131     {
    132         printf("%4d", p->data[i]);
    133     }
    134     printf("
    ");
    135 }
  • 相关阅读:
    body.filters 出现未指明错误
    利用sql server创建可重复运行的存储过程
    有关如何阻止ASP.NET的按钮控件提交页面的小发现
    ASP.NET 2.0中减少ViewState大小的一点小发现
    DataSet 的 Tables 属性对表名大小写敏感性的解惑[翻译]
    利用Sql Server Management Studio 创建视图的问题
    在用数据绑定的时候我为什么不能把焦点移出(Tab out)我的控件?(译)
    什么是 Change Notification,为什么它很重要(译)
    Rms For Sharepoint
    sharepoint 2010 容量边界
  • 原文地址:https://www.cnblogs.com/xiaochi/p/8301531.html
Copyright © 2020-2023  润新知