数据结构基础之—栈

来源:互联网 发布:luajit windows 编辑:程序博客网 时间:2024/05/22 14:45

转自:http://blog.csdn.net/thefutureisour/article/details/7838846

前言:

       栈也是线性结构的一种特例。与队列不同,他只有一个口,只能从这里读或者写数据,这个口称为栈顶(top)。栈是一种先进后出的数据结构。先进来的元素会放入栈底,而后进来的元素被放在它的上面,最后进来的元素的上面的位置,称为栈顶。
       栈所提供的操作比一般的线性表要少很多,只提供:初始化、销毁、判断是否为空、求栈的长度、清空栈、将数据压入栈、将数据弹出栈、或得栈顶元素这几种操作。其中将数据压入栈、将数据弹出栈、获得栈顶元素是最重要的。有人可能觉得,将栈顶元素弹出与获得栈顶元素是不是有点重复,其实它们主要的目的在于,很多时候你只想知道当前栈顶的元素是谁,而并不想将它弹出。这样做可以简单一点。

      了解了栈的基本结构和操作以后,自然而然的想到用数组来实现栈:因为前面的元素并不发生变化,只能在最后面入栈或者出栈。让我们看看程序:

代码:

#include <stdio.h>    #include <malloc.h> typedef int  ElemType;typedef struct Stack{ElemType *base;ElemType *top;int stacksize;}Stack;//1.初始化一个空栈//首先为顺序栈分配一个固定大小的数组空间,base指向栈底,并使top的//初值也指向栈底,此时栈为空.stacksize为栈的最大容量。bool initStack(Stack *s, int size){s->base = (ElemType*)malloc(size*sizeof(ElemType));if (s->base == NULL)return false;s->stacksize = size;s->top = s->base;return true;}//2.销毁栈  void destroyStack(Stack *s){free(s->base);s->base = NULL;s->stacksize = 0;s->top = NULL;}//3.判断栈是否为空 bool is_empty(Stack *s){if (s->top == s->base){printf("the static is full !");return true;}return false;}//4.返回栈的长度  int stackLength(Stack *s){int L = s->top - s->base;return L;}//5.入栈bool push(Stack *s, ElemType e){//如果栈已经满了,重新非配内存  if (stackLength(s) == s->stacksize){s->base = (ElemType *)realloc(s->base, sizeof(ElemType)*s->stacksize * 2);if (NULL == s->base)return false;s->stacksize *= 2;}//先将top的位置放入e,再将top位置加1  *(s->top)++ = e;//*表示取此指针的值return true;}//6.出栈  bool pop(Stack *s, ElemType *e){if (is_empty(s))return false;else{//将top位置减1,然后返回这个位置的值  *e = *(--s->top);return true;}}//7.返回栈顶元素  bool gerHead(Stack *s, ElemType *e){//如果栈为空,返回错误  if (is_empty(s))return false;else{//top的下一个位置就是栈顶元素  *e = *(s->top - 1);return true;}}
  
       感觉简单了不少啊!

       栈在在平时很有很多重要的应用,比如当函数调用时,就会用到栈,将当前的数据保存起来,等调用结束以后再弹出。下面举一个简单的例子:10进制到2进制的转化。

int main(){int a = 0;int b, c;Stack myStack;initStack(&myStack, 5000);printf("please enter a number: ");cin >> a ;printf("%d in binary system is : ", a);do{c = a % 2;a = a / 2;push(&myStack, c);} while (a != 0);//根据10进制转换成2进制的公式,我们每次把余数放进栈里while (!iis_empty(&myStack))//将栈里的余数按顺序取出来,并打印出来{pop(&myStack, &b);printf("%d", b);}destroyStack(&myStack);return 0;}
说明:

      在原版稍微改了一点,原版的编译不通过。最后跳出第二个循环时,打印出"the static is full !"。

      我们再三强调,队列和栈都是特殊的线性结构。所以在C++中的STL库中,并没有定义这种类型的容器,而是用“容器适配器”的方法实现了它们(不懂)。


0 0
原创粉丝点击