今天学习了数据结构中栈,队列的知识
相对于单链表来说,栈和队列就是添加的方式不同,队列就相当于排队,先排队的先出来(FIFO),而栈就相当于弹夹,先压进去的子弹后出来(FILO)。
首先看一下栈(Stack)的实现
1 #include<stdio.h> 2 #include<stdlib.h> 3 #define TRUE 1 4 #define FALES 0 5 typedef struct NODE 6 { 7 int i; 8 struct NODE *pNext; //指向的是 上一个从栈顶刚压入的结点 9 }Stack; 10 typedef int BOOL; //因为c语言里没有布尔类型,所以用int模拟一下 11 void Push(Stack **pTop,int i); 12 BOOL IfEmpty(Stack *pTop); 13 Stack *Pop(Stack **pTop); //出栈操作 14 int main() 15 { 16 Stack *pTop = NULL; 17 18 19 } 20 void Push(Stack **pTop,int i) //压栈操作 21 { 22 Stack *pTemp = (Stack *)malloc(sizeof(Stack)); 23 pTemp->i = i; 24 pTemp->pNext = NULL; 25 26 pTemp->pNext = *pTop; 27 *pTop = pTemp; 28 29 return; 30 } 31 BOOL IfEmpty(Stack *pTop) //因为c++的STL容器里存在判断栈是否为空的操作,在这模拟一下 32 { 33 if(pTop == NULL) 34 return TRUE; 35 return FALES; 36 } 37 Stack *Pop(Stack **pTop) 38 { 39 Stack *pPop = NULL; 40 if(IfEmpty(*pTop)) 41 { 42 return NULL; 43 } 44 else 45 { 46 pPop = *pTop; 47 *pTop = (*pTop)->pNext; 48 return pPop; 49 } 50 }
其次队列(Queue)的实现非常简单,队列压入的实现就和单链表尾添加一样,而弹出就和单链表头删除是一样的,只不过不需要free直接返回队首指针即可;
那么栈和栈区又有什么区别呢?先看这样一段程序
1 #include<stdio.h> 2 int main() 3 { 4 int i = 1; 5 printf("%d %d\n ",i,i++); 6 7 return 0; 8 }
可能一打眼看 就认为是1 1,但测试后发现是 2 1,这就不免让人联想到先进后出的特点了,由于printf是一个标准输出库函数,i 和 i++都算做是两个实参,在函数中,形参也是一个局部变量,在函数这个堆区中存在,按照图中出栈的顺序先B后A,那么先 i++ 出来为 1 ,i 其次出来就为2了(启示就是,在栈区中 若一个函数的参数用了同一个变量 ,记得栈的特点)
双向链表,故名思意就是有一个链表可正向可反向,也就是在添加每个结点的时候,加入一个指针,指向上一个结点的地址,代码如下:
1 #include<stdio.h> 2 #include<stdlib.h> 3 typedef struct NODE 4 { 5 int id; 6 struct NODE *pNext; 7 struct NODE *pLast; //指向上个结点 8 }List; 9 void AddNode(List **ppHead,List **ppEnd,int id); 10 int main() 11 { 12 List *pHead = NULL; 13 List *pEnd = NULL; 14 AddNode(&pHead,&pEnd,1); 15 AddNode(&pHead,&pEnd,2); 16 AddNode(&pHead,&pEnd,3); 17 AddNode(&pHead,&pEnd,4); 18 19 while(pHead) 20 { 21 printf("%d\n",pHead->id); 22 pHead = pHead->pNext; 23 } 24 printf("\n"); 25 26 27 while(pEnd) 28 { 29 printf("%d\n",pEnd->id); 30 pEnd = pEnd->pLast; 31 } 32 33 34 } 35 void AddNode(List **ppHead,List **ppEnd,int id) 36 { 37 List *pTemp = (List *)malloc(sizeof(List)); 38 pTemp->id = id; 39 pTemp->pLast = NULL; 40 pTemp->pNext = NULL; 41 42 if(*ppHead == NULL) 43 { 44 *ppHead = pTemp; 45 *ppEnd = pTemp; 46 } 47 else 48 { 49 (*ppEnd)->pNext = pTemp; 50 pTemp->pLast = *ppEnd; 51 *ppEnd = pTemp; 52 } 53 return; 54 }
2019-04-29 22:32:52 编程菜鸟自我反省,大佬勿喷,谢谢!!!