学习整理:堆栈和队列——数组、链表的基础实现

---恢复内容开始---

堆栈、队列是整个数据结构的重要基础,这里总结了用链表和数组来实现堆、队列的创立,出队、入队、出栈、入栈的过程。

思路总结:

首先是堆栈,堆栈具有先进后出的特点,实现的思路有两种,其一是利用结体中的数组,预设好最大值,然后对结构体内的堆栈值进行操作。

先来尝试链表方法:

首先声明一个结构体以及要去实现的出栈入栈函数:

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 }

 

posted @ 2016-09-12 21:33  Madao东治  阅读(1569)  评论(2编辑  收藏  举报