数据结构(C++) 栈-优先队列

来源:互联网 发布:工业控制软件系统 编辑:程序博客网 时间:2024/06/08 14:10
#include<stdio.h>#include<stdlib.h>#include<time.h>#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define OVERFLOW -1#define INFEASIBLE -2typedef struct List {    int data;    struct List *next;}Queue,*SqQueue;typedef struct {    SqQueue front;    SqQueue rear;}LinkQueue;void Queue_Init(LinkQueue &Q){    Q.front=(SqQueue)malloc(sizeof(Queue));//申请空间并判断是否成功    if(!Q.front)        exit(OVERFLOW);    Q.rear=Q.front;//队头与队尾指向同一个空间    Q.front->data=0;//初始化队长    Q.rear->next=NULL;}//创建队列void Queue_Insert(LinkQueue &Q,int Data){    SqQueue node;    node=(SqQueue)malloc(sizeof(Queue));//申请空间并判断是否成功    if(!node)        exit(OVERFLOW);    node->data=Data;//赋值    node->next=NULL;    Q.rear->next=node;    Q.rear=node;     Q.front->data++;//插入队尾}//插入元素void Queue_Create(LinkQueue &Q){    int i,Data,length;    srand(time(0));    printf("请输入队列长度:");    scanf("%d",&length);//输入长度    for(i=1;i<=length;i++)    {        Data=rand()%100;//      scanf("%d",&Data);        Queue_Insert(Q,Data);//插入元素    }}//尾插法创建队列int Queue_Delete(LinkQueue &Q,int &Data){    SqQueue node;    if(!Q.front->next)//判断队列是否为空        return ERROR;    node=Q.front->next;    Q.front->next=node->next;//指针移位    Data=node->data;    free(node);//删除队头    return OK;}//删除元素void Queue_Clear(LinkQueue &Q){    int State,Data;    while(Q.front->next)        State=Queue_Delete(Q,Data);//逐个删除元素    Q.front->data=0;}//清空队列void Queue_Destroy(LinkQueue &Q){    Queue_Clear(Q);//清空表    free(Q.front);//销毁队头指针}//销毁队列void Queue_Show(LinkQueue &Q){    SqQueue p=Q.front->next;    while(p)//当p为空时终止循环    {        printf("%0d ",p->data);        p=p->next;//指针移位    }    printf("\n");}//输出队列void Queue_Assign(LinkQueue &Q,int Pos,int Data){    SqQueue p=Q.front->next;    int i=1;    while(p&&i<Pos)//查找队中位置为pos的元素    {        p=p->next;//指针移位        i++;    }    p->data=Data;}//按位置赋值int Queue_Getvalue(LinkQueue &Q,int Pos){    SqQueue p=Q.front->next;    int i=1;    while(p&&i<Pos)//查找队中位置为pos的元素    {        p=p->next;//指针移位        i++;    }    return p->data;}//按位置取值void Queue_Exchange(LinkQueue &Q,int i,int j){    int Data_i,Data_j;    Data_i=Queue_Getvalue(Q,i);    Data_j=Queue_Getvalue(Q,j);//分别取值    Queue_Assign(Q,i,Data_j);    Queue_Assign(Q,j,Data_i);//分别赋值}//交换元素void Queue_Adjustheap(LinkQueue &Q,int i,int N) {    int L=2*i,R=2*i+1,Max=i;     if (L<=N&&Queue_Getvalue(Q,L)>Queue_Getvalue(Q,Max))          Max=L;    if (R<=N&&Queue_Getvalue(Q,R)>Queue_Getvalue(Q,Max))          Max=R;//找到最大的子数    if (Max!=i)      {          Queue_Exchange(Q,i,Max); //交换两者的值        Queue_Adjustheap(Q,Max,N);//递归调用    }  }//调整堆void Queue_Buildheap(LinkQueue &Q,int N){    int i;    for(i=N/2;i>=1;i--)        Queue_Adjustheap(Q,i,N); //调用调整堆}//创建最堆void Queue_Sortheap(LinkQueue &Q,int N)  {      int i;    Queue_Buildheap(Q,N);//创建最大堆     printf("创建最大堆:\n");    Queue_Show(Q);    printf("\n");    for (i=N;i>=1;i--)      {          Queue_Exchange(Q,1,N);//交换堆顶与最后一个元素        printf("%02d:调整堆:",Q.front->data-i+1);        Queue_Show(Q);        N--;          Queue_Adjustheap(Q,1,N);//调整堆    }   }//堆排序int main(){    LinkQueue Q;    Queue_Init(Q);    Queue_Create(Q);    printf("原始队列:\n");    Queue_Show(Q);    Queue_Sortheap(Q,Q.front->data);    return 0;}
原创粉丝点击