栈:
#include "stdio.h"#include "stdlib.h"#define MAX_SIZE 100typedef struct stack{ int *base; int top;}Stack;int InitStack(Stack *stack){ stack->base=(int *)malloc(MAX_SIZE*sizeof(int)); if(!stack->base) return -1; stack->top=0; return 1;}int IsEmpty(Stack *stack){ if(0==stack->top) return 1; return 0;}int IsFull(Stack *stack){ if(MAX_SIZE-1==stack->top) return 1; return 0;}int Push(Stack *stack,int e){ if(!IsFull(stack)) { stack->base[stack->top]=e;stack->top+=1; return 1; } return -1;}int Pop(Stack *stack){ if(!IsEmpty(stack)) { stack->top-=1; return stack->base[stack->top]; } return -1;}void main(){ int i=1; Stack *stack=(Stack *)malloc(sizeof(Stack)); if(InitStack(stack)) { while(i<=10) { Push(stack,i); i++; } } printf("栈中元素出栈(先进后出):\n"); while(!IsEmpty(stack)) printf("%d\t",Pop(stack));}
队列:
#include "stdio.h"#include "stdlib.h"#define MAX_SIZE 10//虽然容量是10,但注意该循环队列只能保存9个整数typedef struct queue{ int *base; int rear; int front;}SqQueue;//初始化循环队列int InitQueue(SqQueue *sqqueue){ sqqueue->base=(int *)malloc(MAX_SIZE*sizeof(int)); if(!sqqueue->base)return -1; sqqueue->rear=0; sqqueue->front=0; return 1;}//入队int EnQueue(SqQueue *sqqueue,int e){ if((sqqueue->rear+1)%MAX_SIZE==sqqueue->front)return -1; sqqueue->base[sqqueue->rear]=e; sqqueue->rear=(sqqueue->rear+1)%MAX_SIZE; return 1;}//获取对头元素int FrontQueue(SqQueue *sqqueue){ if(Empty(sqqueue))return -1; return sqqueue->base[sqqueue->front];}//出队int DeQueue(SqQueue *sqqueue){ int i=0; if(sqqueue->rear==sqqueue->front)return -1; i=FrontQueue(sqqueue); sqqueue->front=(sqqueue->front+1)%MAX_SIZE; return i;}//判断队列是否为空。注意空和满的条件int Empty(SqQueue *sqqueue){ if(sqqueue->rear==sqqueue->front) return 1; else return 0;}void main(){ int i=1; SqQueue *sqqueue=(SqQueue *)malloc(sizeof(SqQueue)); if(InitQueue(sqqueue)) { while(i<=10)//最后一次入队失败。因为要损失一个空间存放尾指针 { EnQueue(sqqueue,i); i++; } } printf("打印队列元素\n"); while(!Empty(sqqueue)) printf("%d\n",DeQueue(sqqueue));}
败者树:
#include "stdio.h"#define K 8#define MINKEY -1//比所有关键字都小的一个值#define MAXKEY 1000//比所有关键字都大的一个值int b[K];void Adjust(int ls[K],int s)//败者树存储在ls[1]~ls[K-1]中,s为记录所在的归并段号{ int t,temp; t=(s+K)/2;//t为b[s]的父节点所在败者树中的下标,K是归并段数 while(t>0)//没有到达树根则继续 { if(b[s]>b[ls[t]]){ //与父节点指示的数据进行比较 temp=s;s=ls[t];//指示胜者,胜者将去参加更上一层比较 ls[t]=temp;//ls[t]记录败者所在的段号 } t=t/2;//向树根回退一层 } ls[0]=s;//ls[0]记录本趟最小关键字所在的短号}int Get_next(int i){}void K_merger(int ls[K])/*ls[0]~ls[K-1]是败者树的内部节点。b[0]~b[K-1]分别存储K个初始归并段的当前记录*//*函数Get_next(i)从第i个归并段读取并返回当前记录,若归并段为空,则返回MAXKEY*/{ int b[K+1],i,q; for(i=0;i=0;--i)//依次从b[K-1],b[K-1]..b[0]出发调整败者树。 Adjust(ls,i); while(b[ls[0]]!=MAXKEY)//ls[0]记录本趟最小关键字所在的段号 { q=ls[0];//q是当前最小关键字的所在的归并段。 printf("%d",b[q]); b[q]=Get_next(q); Adjust(ls,q); }}