学习整理:堆栈和队列——数组、链表的基础实现
---恢复内容开始---
堆栈、队列是整个数据结构的重要基础,这里总结了用链表和数组来实现堆、队列的创立,出队、入队、出栈、入栈的过程。
思路总结:
首先是堆栈,堆栈具有先进后出的特点,实现的思路有两种,其一是利用结体中的数组,预设好最大值,然后对结构体内的堆栈值进行操作。
先来尝试链表方法:
首先声明一个结构体以及要去实现的出栈入栈函数:
typedef struct example{ int data; struct example *pNext; }STACK,* PSTACK; int Pushstakc(PSTACK,int);//入栈 int Popstack(PSTACK);//出栈 PSTACK crateStack();//建立一个栈
然后下面是具体的函数操作:
1 PSTACK crateStack(){//声明一个堆栈 2 PSTACK stack; 3 stack=(PSTACK)malloc(sizeof(STACK)); 4 stack->pNext=NULL; 5 stack->data=NULL; 6 return(stack); 7 } 8 int Pushstakc(PSTACK stack,int numb){//实现入栈 9 PSTACK TemStack; 10 TemStack=(PSTACK)malloc(sizeof(STACK));//声明一个临时链表,将要入栈的数据存放进去 11 TemStack->data=numb; 12 TemStack->pNext=stack->pNext;//将数据入栈 13 stack->pNext=TemStack;//重新构建指针指向 14 return(1); 15 } 16 int Popstack(PSTACK stack){//实现出栈 17 PSTACK TempStack;int TempNumber; 18 if(stack->pNext==NULL){//判别是否是一个空栈 19 puts("no stack to pop"); 20 return(0); 21 } 22 TempStack=stack->pNext; 23 stack->pNext=TempStack->pNext;//出栈,与入栈同理 24 TempNumber=TempStack->data; 25 free(TempStack);//将临时空间释放 26 return(TempNumber); 27 }
另一种方法是通过数组来实现堆栈的创立:
首先声明一个结构体及其函数:
1 typedef struct example{ 2 int top;//代替指针,表明栈的高度 3 int Maxsize; 4 int *data; 5 }STACK,* PSTACK; 6 PSTACK createStack(int); 7 int PushStack(PSTACK,int); 8 int PopStack(PSTACK);
下面是函数实现的具体过程:
1 PSTACK createStack(int maxsize){ 2 PSTACK stack; 3 stack=(PSTACK)malloc(sizeof(STACK)); 4 if(stack==NULL) 5 return(0); 6 stack->Maxsize=maxsize; 7 stack->data=(int *)malloc(maxsize * sizeof(int)); 8 stack->top=-1;//初始化TOP值为1 9 return(stack); 10 } 11 int PushStack(PSTACK stack,int numb){ 12 if(stack->top==stack->Maxsize){ 13 puts("full!"); 14 return(0); 15 } 16 stack->top++; 17 stack->data[stack->top]=numb; 18 return(1); 19 } 20 int PopStack(PSTACK stack){ 21 if(stack->top==-1){ 22 puts("NO MORE DATA!"); 23 return(0); 24 } 25 return(stack->data[(stack->top)--]); 26 }
队列的思路和栈不一样,一个是最基本的先进先出特点不一样,其次是,构建一个环形队列,需要两个指标,一个是表示队列头部的Front,和表示队列尾部的Rear(这里的代码把rear和Front写反了)
首先仍然是声明一个结构体和相关函数:
1 #include <stdio.h> 2 #include <stdlib.h> 3 typedef struct example{ 4 int *data; 5 int Front; 6 int rear; 7 int CurrentSize;//用于判断队列是否满了 8 int MaxSize; 9 }STACK,* PSTACK; 10 int PushStack(PSTACK,int); 11 PSTACK creatPstack(int); 12 int PopStack(PSTACK);
对于一个普通的循环队列来说,我们认为如果REAR=Front则队列满了,然而实际上这也可能是一个空队列,针对这样的情况我们认为可以通过俩个方法,一个是减少队列个事,使得首位不相交,另一个方法是设立一个CurrenSize指标,记录队列的大小,为了更加方便理解,这里使用了SIZE指标而非前者。
1 STACK creatPstack(int numb){ 2 PSTACK stack; 3 stack=(PSTACK)malloc(sizeof(STACK)); 4 stack->data=(int * )malloc(numb * sizeof(int)); 5 stack->Front=NULL; 6 stack->rear=NULL; 7 stack->MaxSize=numb; 8 } 9 int PushStack(PSTACK stack,int numb){ 10 if(stack->Front==stack->MaxSize){ 11 puts("reach the max capability"); 12 return(0); 13 } 14 stack->rear=(stack->rear++)%(stack->MaxSize);//用这种方式可以轻松解决了在遇到6变成0的情况 15 stack->data[stack->rear]=numb; 16 return(1); 17 } 18 int PopStack(PSTACK stack){ 19 int TempNumber; 20 if(stack->MaxSize==0){ 21 puts("it is empty!"); 22 return(0); 23 } 24 stack->Front=(stack->Front++)%(stack->MaxSize); 25 TempNumber=stack->data[stack->Front]; 26 return(TempNumber); 27 }