数据结构栈的构造

  数据结构中的栈,是后进先出的线性表。

  对于栈,实质上由两个结构体组成。一位栈结构体,该结构体中存储三个数据成员,分别为栈顶指针,栈底指针,以及以整型变量记录栈的最大长度。  二为节点结构体,此结构体的数据成员看现实情况需要。

  

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #define ad 10
 4 typedef struct stack{//节点 
 5     char ch;
 6 }stack;
 7 typedef struct node{//
 8     stack *top;
 9     stack *base;
10     int size;
11 }kuo;

   上面的这段代码定义了stack的节点结构体以及栈结构体。在栈结构体中的两个指针变量的类型应该是栈结构体的类型,也就是本例中的stack型。int型变量size将记录栈的长度。

1 void creat(kuo&S){
2     S.base=(stack *)malloc(100*sizeof(stack));//为栈分配空间
3     if(!S.base) exit(0);//分配空间失败,则停止运行程序
4     S.top=S.base;//将栈顶指针指向栈底指针所指向的
5     S.size=100;//前面分配了100个长度的空间,所以将size初始化为100
6 }//创建一个空栈 

  在这段代码中,我将malloc函数返回的指针强制转化为stack型,也就是节点型指针。而前面之所以将栈结构体中的两个指针变量定义为节点型,就是因为之后对栈进行操作是对S.top操作。

void add(kuo&S,stack b)//S为引用
{
    if(S.top-S.base>=S.size)/*如果栈满,也就是栈的长度达到size所限定的长度*/
    {
        S.base=(stack *)realloc(S.base,(S.size+ad)*sizeof(stack));/*重新分配内存,realloc函数申请一个长度为(S.size+ad)*sizeof(stack)长度的空间,并将S.base指向的内容拷贝到该区域*/
        S.size+=ad;//增加S.size
        if(!S.base) exit(0);//如果分配内存失败,停止程序
    }
    *S.top++=b;//若栈未满,这将S.top指向的地址里加入b。
}

  代码中*S.top++=b,是将b的副本加入栈,并不是将b加入栈,所以栈在内存上是连续的。

int del(kuo&S)
{
    if(S.top==S.base) exit(0);/*如果栈为空,则停止程序,但我觉得返回错误值更好,但现在不想改。*/
    --S.top;//将栈顶指针往后移
    if(S.top==S.base) return 0;//这之后的两行是我根据题目需要添加的
    return 1;
}

  这里S.top自减,开始我还疑惑为什么不解放内存,后来百度后才知道,将top指针往后移,就是将原来的节点删除,当然,这时这个节点还在原来的内存中,之后往栈中添加节点将会覆盖点这个节点,所以没必要,也不能解放内存。

 

  好了,大概内容就这些了。

 

posted @ 2017-04-15 08:33  岁月难言  阅读(711)  评论(0编辑  收藏  举报