queue.h
#pragma once
#include <process.h>
#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#define N 100 //隊列長度
struct queue {
int data[N];
int head;//資料開頭
int back;//資料結尾
};
typedef struct queue Queue; //簡寫
void init(Queue *p);//初始化
int isempty(Queue *p);//判斷隊列是否為空
int isfull(Queue *p);//判斷是否滿了
void enQueue(Queue *p, int key);//吃進去
int getlast(Queue *p);//擷取彈出的資料
void deQueue(Queue *p);//出隊
void show(Queue *p);//顯示
queue.c
#include "queue.h"
void init(Queue *p)//初始化
{
p->head = p->back = 0; //隊列為空
memset(p->data, 0, sizeof(int)*N);//資料清零
}
int isempty(Queue *p)//判斷隊列是否為空
{
if (p->head == p->back) { //隊列為空, 頭尾重合
return 1;
}
else {
return 0;
}
}
int isfull(Queue *p)//判斷是否滿了
{
if (p->back == N - 1) {
return 1;
}
else {
return 0;
}
}
void enQueue(Queue *p, int key)//吃進去
{
if (isfull(p)) {
return;
}else {
if (isempty(p) == 1) {
p->data[0] = key;
p->back++; //吃進一個東西
}
else {
for (int i = p->back; i >0; i--) {
p->data[i ] = p->data[i-1];//隊列後移
}
p->data[0] = key;
p->back++;
}
}
}
int getlast(Queue *p)//擷取彈出的資料
{
return p->data[p->back - 1];//要彈出的資料
}
void deQueue(Queue *p)//出隊
{
if (isempty(p)) {
return;
}
else {
p->back--;
}
}
void show(Queue *p)//顯示
{
printf("隊列狀态 ");
for (int i = 0; i < p->back; i++) {
printf("%4d", p->data[i]);
}
printf("\n");
}
隊列(main1)和多線程.c
#include "queue.h"
void main1() {
struct queue myq;
init(&myq);
for (int i = 99; i < 108; i++) {
enQueue(&myq, i);
show(&myq);
}
while (!isempty(&myq)) {
printf("拉出的值%d \n",getlast(&myq));
deQueue(&myq);
show(&myq);
}
system("pause");
}
struct queue myq;
void run(void *p) {
int *px = p;
printf("線程編号%d\n", *px);
enQueue(&myq, *px);
}
void main() {
init(&myq);
int a[10] = { 1,2,3,4,5,6,7,8,9,0 };
for (int i = 0; i < 10; i++) {
HANDLE mythread = _beginthread(run, 0, &a[i]);//mythread線程編号
//WaitForSingleObject(mythread,INFINITE); //等待
//WaitForMultipleObjects();
}
system("pause");
show(&myq);
system("pause");
}