数据结构中的栈,是后进先出的线性表。
对于栈,实质上由两个结构体组成。一位栈结构体,该结构体中存储三个数据成员,分别为栈顶指针,栈底指针,以及以整型变量记录栈的最大长度。 二为节点结构体,此结构体的数据成员看现实情况需要。
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指针往后移,就是将原来的节点删除,当然,这时这个节点还在原来的内存中,之后往栈中添加节点将会覆盖点这个节点,所以没必要,也不能解放内存。
好了,大概内容就这些了。