栈的创建、遍历、压栈与入栈
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <malloc.h> 4 #include <stdbool.h> 5 6 typedef struct Node{ 7 int data; 8 struct Node * pNext; 9 }NODE, *PNODE; 10 11 typedef struct Stack{ 12 PNODE pTop; 13 PNODE pBottom; 14 }STACK, *PSTACK; //PSTACK等价于struct Stack 15 16 void initStack(PSTACK pS); 17 void pushStack(PSTACK pS, int val); 18 bool popStack(PSTACK pS, int *pVal); 19 void traverse(PSTACK pS); 20 bool isEmpty(PSTACK pS); 21 void clear(PSTACK pS); 22 23 int main() 24 { 25 int val; 26 STACK s; //STACK等价于struct Stack; 27 initStack(&s); 28 pushStack(&s, 1); 29 pushStack(&s, 2); 30 pushStack(&s, 3); 31 pushStack(&s, 4); 32 pushStack(&s, 5); 33 pushStack(&s, 6); 34 traverse(&s); 35 if(popStack(&s, &val)){ 36 printf("出栈成功!\n"); 37 printf("出栈的元素是:%d!\n", val); 38 }else{ 39 printf("出栈失败!\n"); 40 } 41 42 traverse(&s); 43 44 clear(&s); 45 traverse(&s); 46 47 system("pause"); 48 return 0; 49 } 50 51 void initStack(PSTACK pS){ 52 53 pS->pTop = (PNODE)malloc(sizeof(NODE)); 54 if(NULL == pS->pTop){ 55 printf("动态内存分配失败!\n"); 56 exit(-1); 57 }else{ 58 pS->pBottom = pS->pTop; 59 pS->pTop->pNext = NULL; //pS->pBottom->pNext = NULL; 60 //头节点所指向的指针域为空 61 } 62 } 63 64 void pushStack(PSTACK pS, int val){ 65 PNODE pNew = (PNODE)malloc(sizeof(NODE)); 66 pNew->data = val; 67 pNew->pNext = pS->pTop; // pS->pTop不能改成pS->pBotton 68 pS->pTop = pNew; //栈顶指向新节点 69 return ; 70 } 71 72 73 void traverse(PSTACK pS){ 74 PNODE p = pS->pTop; 75 printf("遍历栈:\n"); 76 while(p != pS->pBottom){ 77 printf("%d ", p->data); 78 p = p->pNext; 79 } 80 printf("\n"); 81 } 82 83 bool isEmpty(PSTACK pS){ 84 if(pS->pTop == pS->pBottom) 85 return true; 86 else 87 return false; 88 } 89 90 //把pS所指向的栈出栈一次,并把出栈的元素存入pVal形参所指向的变量中 91 bool popStack(PSTACK pS,int *pVal){ 92 if(isEmpty(pS)){ //pS本身存放的就是S的地址 93 printf("出栈失败!\n"); 94 return false; 95 } 96 97 PNODE r = pS->pTop; 98 *pVal = r->data; 99 pS->pTop = r->pNext; 100 free(r); 101 r = NULL; 102 return true; 103 } 104 105 void clear(PSTACK pS){ 106 if(isEmpty(pS)){ 107 return; 108 } 109 110 PNODE p = pS->pTop; 111 PNODE q = NULL; 112 while(p != pS->pBottom){ 113 q = p->pNext; 114 free(p); 115 p = q; 116 } 117 pS->pTop = pS->pBottom; 118 }