线性结构的两种常见应用之一----栈

定义--“弹夹”原理----先进后出--first in last out -FILO (类似于往箱子里面放东西) 分类--1> 静态栈--数组 2> 动态栈--链栈,顺序栈(链表原理) --只能在头部进行插入和删除

算法: 1>出栈push 2>入栈(压栈)pop 3.判断栈满栈空

应用: 函数的调用--依靠压栈和出栈 函数参数的存储--压栈 局部变量的存储 中断 表达式求值 内存分配 缓冲处理 迷宫

1 #include <stdio.h>
2 #include <stdlib.h> 3 #include <assert.h> 4 #include <unistd.h> 5 //栈--动态栈--一般不存在栈满的问题 6 //1.栈的初始化--创建空栈 7 //2.入栈(压栈)--往栈中添加元素 8 //3.栈的遍历输出 9 //4.出栈--lifo-后进先出 10 //5.判断栈是否为空 11 //6.出栈--一个一个的出 "弹夹原理" 12 //7.清空栈 13 14 15 16 typedef struct node 17 { 18 int data; 19 struct node* next; 20 }node,*pnode; 21 22 typedef struct stack 23 { 24 pnode top;//栈顶 25 pnode base;//栈底 26 }stack,*pstack; 27 28 29 //函数的声明 30 void init(pstack s); 31 void push(pstack s); 32 void traverse(pstack s); 33 void pop(pstack s); 34 void clear(pstack s); 35 36 int main() 37 { 38 stack s; 39 init(&s); //栈的初始化--创建一个空栈 40 push(&s); //入栈--一个一个的压 41 traverse(&s); //遍历输出 42 putchar(10); // 换行 43 44 pop(&s);//出栈 45 traverse(&s); //遍历输出 46 putchar(10); 47 clear(&s); //清空 48 } 49 50 51 //1.栈的初始化--创建一个空栈 52 void init(pstack s) 53 { 54 s->top=(pnode)malloc(sizeof(node)); //要初始化,首先就得先分配空间 55 assert(s->top != NULL ); //判断动态内存空间是否分配成功 56 s->base =s->top; //空栈的时候,栈底就是栈顶 57 //只能这样写,因为base没有分配空间,如果换位置,就会发生段错误 58 s->top->next =NULL; //类似与链表中的初始化的头节点指向NULL 59 60 } 61 62 //2.入栈 63 void push(pstack s) 64 { 65 int len=0; 66 int val=0; 67 int i=0; 68 printf("你想要往栈中添加几个元素?\n"); 69 scanf("%d",&len); 70 char ch =getchar(); 71 for(i=0;i<len;i++) 72 { 73 pnode new =(pnode)malloc(sizeof(node)); 74 assert(new != NULL); 75 printf("请输入第%d个压入栈中的值: \n",i+1); 76 scanf("%d",&val); 77 new -> data =val; 78 new -> next =s->top; 79 s->top =new; 80 } 81 } 82 83 //遍历输出 84 void traverse(pstack s) 85 { 86 pnode p=s->top; 87 while(p != s->base) 88 { 89 printf("%d ",p->data); 90 p=p->next; 91 } 92 93 } 94 95 //出栈 96 void pop(pstack s) 97 { 98 if(s->top != s->base) 99 { 100 pnode p=s->top; 101 s->top=s->top->next; 102 free(p); 103 printf("出栈成功!\n"); 104 } 105 else if(s->top == s->base) 106 { 107 printf("栈中已经没有元素啦!\n"); 108 } 109 } 110 111 //栈的清空 112 void clear(pstack s) 113 { 114 if(s->top == s->base) 115 { 116 printf("栈中已经没有元素啦!\n"); 117 } 118 else 119 { 120 printf("开始清空!\n"); 121 sleep(1); 122 while(s->top != s->base) 123 { 124 pnode p=s->top; 125 s->top=s->top->next; 126 free(p); 127 p=s->top; 128 } 129 printf("清空完毕,退出程序!\n"); 130 exit(-1); 131 132 } 133 134 135 }