8.线性结构的应用-栈【郝斌数据结构】
栈:实质就是一个操作受限的链表
栈里面的内存是由程序自动分配的,堆里面的内存是由程序员手动分配的。
1.定义:一种可以实现“先进后出”的存储结构
栈类似于箱子
2.分类:
静态栈
动态栈
3.算法
出栈
压栈
图解:

例题:
1 # include <stdio.h> 2 # include <malloc.h> 3 # include <stdlib.h> 4 typedef struct Node 5 { 6 int data; 7 struct Node * pNext; 8 }NODE, *PNODE; 9 typedef struct Stack 10 { 11 PNODE pTop; 12 PNODE pBottom; 13 }STACK, * PSTACK; 14 void initStack( PSTACK);//PSTACK等价于struct Stack * 15 void pushStack(PSTACK, int); 16 void traverseStack(PSTACK); 17 bool emptyStack(PSTACK); 18 bool popStack(PSTACK, int *); 19 void clear(PSTACK); 20 int main(void) 21 { 22 STACK s;//STACK等价于 struct Stack 23 int val; 24 initStack(&s);//目的正在造出一个空栈 25 pushStack(&s, 1);//压栈 26 pushStack(&s, -99); 27 pushStack(&s, 88); 28 pushStack(&s, 2); 29 pushStack(&s, 10); 30 traverseStack(&s);//遍历输出 31 if (popStack(&s, &val)) 32 { 33 printf("出栈成功,出栈元素是:%d\n", val); 34 } 35 else 36 { 37 printf("出栈失败!"); 38 } 39 traverseStack(&s);//遍历输出 40 clear(&s); 41 printf("清除后为空栈"); 42 traverseStack(&s);//遍历输出 43 return 0; 44 } 45 //初始化栈 46 void initStack(PSTACK pS) 47 { 48 pS->pTop = (PNODE)malloc(sizeof(NODE)); 49 if (NULL == pS->pTop) 50 { 51 printf("动态内存分配失败!\n"); 52 exit(-1); 53 } 54 else 55 { 56 pS->pBottom = pS->pTop; 57 pS->pTop->pNext = NULL; 58 } 59 } 60 //压栈 61 void pushStack(PSTACK pS, int val) 62 { 63 PNODE pNew = (PNODE)malloc(sizeof(NODE)); 64 pNew->data = val; 65 pNew->pNext = pS->pTop;//pS->pTop不能改成pS->pBottom 66 pS->pTop = pNew; 67 } 68 //遍历 69 void traverseStack(PSTACK pS) 70 { 71 PNODE p = pS->pTop; 72 while (p != pS->pBottom) 73 { 74 printf("%d ", p->data); 75 p = p->pNext; 76 } 77 printf("\n"); 78 return; 79 } 80 bool emptyStack(PSTACK pS) 81 { 82 if (pS->pTop == pS->pBottom) 83 return true; 84 else 85 return false; 86 87 } 88 //把pS所指向的栈出栈一次,并把出栈的元素存入pVal形参所指向的变量中,如果出栈失败返回false,否则返回true 89 bool popStack(PSTACK pS, int * pVal) 90 { 91 92 if (emptyStack(pS))//pS本身存放的就是s的地址 93 { 94 return false; 95 } 96 else 97 { 98 PNODE r = pS->pTop; 99 *pVal = r->data; 100 pS->pTop = r->pNext; 101 free(r); 102 r = NULL; 103 return true; 104 } 105 } 106 //clear()清空 107 void clear(PSTACK pS) 108 { 109 if (emptyStack(pS)) 110 { 111 return; 112 } 113 PNODE p = pS->pTop; 114 PNODE q; 115 while (p != pS->pBottom) 116 { 117 q = p->pNext; 118 pS->pTop = q; 119 free(p); 120 p = q; 121 } 122 }
4.应用
函数调用
中断
表达式求值
内存分配
缓冲处理
迷宫

浙公网安备 33010602011771号