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.应用 

  函数调用

  中断

  表达式求值

  内存分配

  缓冲处理

  迷宫

 

posted @ 2024-08-28 15:14  java帝国  阅读(15)  评论(0)    收藏  举报