[文档下载] 数据结构->栈

[复制链接]
903|3
 楼主| 奥德赛 发表于 2016-1-15 21:19 | 显示全部楼层 |阅读模式
数据结构中的栈是什么
  举一个简单的例子:在往箱子里面放衣物的时候,放在最上面的衣物总是我们最后放上去的;而当我们从箱子里取出衣物的时候,总是最先拿出上面的。这就是现实生活中的栈。
  准确的讲,栈就是一种可以实现“先进后出(或者叫后进先出)”的存储结构。
  学过数据结构的人都知道:栈可以用两种方式来实现,一种方法是用数组实现栈,这种栈成为静态栈;另外一种方法是用链表实现栈,这种栈叫做动态栈。
  栈中通常存放着程序的局部变量等。栈通常有出栈和入栈操作。
  栈的结构
  空栈的结构:【其实就是栈顶和栈顶都指向一个无用的头结点】
  存有结点的栈结构:【栈顶指针指向栈顶结点,栈底指针指向头结点】
  栈的实现
  下面是用C实现的一个链栈结构的源码及详细注释:
  1. #include
  2.   #include
  3.   #include
  4.   //定义结点结构体
  5.   typedef struct Node
  6.   {
  7.   int data; //内容
  8.   struct Node * pNext; //指向下一结点的指针
  9.   } NODE, * PNODE; //NODE等价于struct Node, PNODE等价于struct Node *
  10.   //定义栈的结构体
  11.   typedef struct Stack
  12.   {
  13.   PNODE pTop; //栈顶结点
  14.   PNODE pBottom; //栈底结点
  15.   } STACK, * PSTACK; //STACK等价于struct Stack, PSTACK等价于struct Stack *
  16.   //函数声明
  17.   void initStack(PSTACK pStack); //对栈进行初始化的函数
  18.   void pushStack(PSTACK pStack, int val); //入栈的函数
  19.   bool popStack(PSTACK pStack, int * pVal);//出栈的函数,*pVal用来保存出栈的元素内容
  20.   void traverseStack(PSTACK pStack); //遍历栈的函数
  21.   bool isEmpty(PSTACK pStack); //判断栈是否为空的函数
  22.   void clearStack(PSTACK pStack); //清空栈的函数


 楼主| 奥德赛 发表于 2016-1-15 21:20 | 显示全部楼层
//栈调用示例
  1. int main(void)
  2.   {
  3.   STACK stack; //定义一个栈变量,STACK等价于struct Stack
  4.   int val; //用来保存出栈的内容
  5.   initStack(&stack); //调用栈的初始化函数
  6.   pushStack(&stack, 10); //调用入栈的函数
  7.   pushStack(&stack, 20);
  8.   pushStack(&stack, 30);
  9.   pushStack(&stack, 50);
  10.   traverseStack(&stack); //调用遍历栈的函数
  11.   //调用出栈的函数
  12.   if(popStack(&stack, &val))
  13.   printf("出栈成功,出栈的元素值为:%d\n", val);
  14.   else
  15.   printf(" 出栈失败!");
  16.   //调用清空栈的函数
  17.   clearStack(&stack);
  18.   traverseStack(&stack); //调用遍历栈的函数
  19.   system("pause");
  20.   return 0;
  21.   }

  22. //操作函数的实现
  23.   void initStack(PSTACK pStack)
  24.   {
  25.   //创建一个空结点,让pTop指向它
  26.   pStack->pTop = (PN ODE)malloc(sizeof(NODE));
  27.   if(NULL != pStack->pTop)
  28.   {
  29.   //将pBottom也指向空节点
  30.   pStack->pBottom = pStack->pTop;
  31.   //清空空结点的指针域
  32.   pStack->pTop->pNext = NULL;
  33.   }
  34.   else //如果内存分配失败
  35.   {
  36.   printf("内存分配失败!程序退出!\n");
  37.   exit(-1);
  38.   }
  39.   return;
  40.   }
  41.   void pushStack(PSTACK pStack, int val)
  42.   {
  43.   //动态创建一个新结点
  44.   PNODE pNew = (PNODE)malloc(sizeof(NODE));
  45.   //设置新结点的数据域的值
  46.   pNew->data = val;
  47.   //将新结点的指针域指向之前建的空节点
  48.   pNew->pNext = pStack->pTop; //pStack->pTop不能换成pStack->pBottom
  49.   //pTop指向新的结点
  50.   pStack->pTop = pNew;
  51.   return;
  52.   }
  53.   bool popStack(PSTACK pStack, int * pVal)
  54.   {
  55.   if(isEmpty(pStack))
  56.   {
  57.   return false;
  58.   }
  59.   else
  60.   {
  61.   //先保存栈顶元素的地址,然后将pTop指向下一元素,最后释放之前栈顶元素的内存
  62.   PNODE rNode = pStack->pTop;
  63.   *pVal = rNode->data;
  64.   pStack->pTop = rNode->pNext;
  65.   free(rNode);
  66.   rNode = NULL;
  67.   return true;
  68.   }
  69.   }
 楼主| 奥德赛 发表于 2016-1-15 21:22 | 显示全部楼层
  1. void traverseStack(PSTACK pStack)
  2.   {
  3.   //将栈顶赋给一个临时结点,因为在遍历栈的时候不能销毁栈
  4.   PNODE pNode = pStack->pTop;
  5.   //循环遍历栈,直到栈底
  6.   while(pStack->pBottom != pNode )
  7.   {
  8.   printf("%d ", pNode->data);
  9.   pNode = pNode->pNext;
  10.   }
  11.   printf("\n");
  12.   return;
  13.   }
  14.   bool isEmpty(PSTACK pStack)
  15.   {
  16.   if(pStack->pTop == pStack->pBottom)
  17.   return true;
  18.   else
  19.   return false;
  20.   }
  21.   void clearStack(PSTACK pStack)
  22.   { //栈为空,则退出该函数
  23.   if(isEmpty(pStack))
  24.   {
  25.   return;
  26.   }
  27.   else
  28.   {
  29.   //两个结点指针变量用来释放栈中元素的内存
  30.   PNODE p = pStack->pTop;
  31.   PNODE q = NULL;
  32.   //循环释放内存
  33.   while(p != pStack->pBottom)
  34.   {
  35.   q = p->pNext;
  36.   free(p);
  37.   p = q;
  38.   }
  39.   //将栈顶和栈底指向同一个指针域为空的结点
  40.   pStack->pTop = pStack->pBottom;
  41.   return;
  42.   }
  43.   }

栈的典型应用
  生产消费模型常用栈来实现。生产者生产的东西都放入栈中,然后消费者从栈中依次取出东西,当栈顶和栈底指向都指向首结点时,生产的东西就被消耗光了。
quray1985 发表于 2016-1-17 20:37 | 显示全部楼层
堆和栈的区别还是最大的,栈就是把局部变量存入内存当中
您需要登录后才可以回帖 登录 | 注册

本版积分规则

46

主题

397

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部