一、说明
栈的操作比较简单
保存一个栈顶 top 指针
压栈时,就将节点 链在 top之后
弹栈时,就将top的next 节点删除即可
同 链式队列的实现,top指针所指节点始终为无效节点
实现方法,也同 链式队列类似
二、实现
/***************************************************************** *功 能: 实现栈基本操作 *描 述: 实现栈的链式存储,及其相关操作 *方 法:分配一块内存,栈顶top指针指向该块内存, 但这一块内存,是不保存有效数据的, 操作过程中,top指向的内存始终是不保存有效数据的, 于是栈判空条件就是 top.next==NULL 相当于 浪费了一个栈元素大小(sizeof(Node))的内存区, 但为程序实现提供了极大方便 *时 间: 2010-11-28 ******************************************************************/ #include <stdio.h> #include <malloc.h> //---------------------------数据结构定义--------------------------------------------- typedef int ElemType; typedef struct Node{ //栈节点结构定义 ElemType value; //节点的值 struct Node* next; //下一个节点地址 }Node; typedef struct{ //栈结构定义 Node* top; //栈顶 // Node* base; //栈底 链式栈中 base作用不大 }Stack; //--------------------------栈操作------------------------------------------------ //初始化栈 void InitStack(Stack* stack){ stack->top /*= stack->base*/ = (Node*)malloc(sizeof(Node)); stack->top->next = NULL; //也就等同于 rear->next = NULL } //清空栈 void Clean(Stack* stack){ Node* pNode,*tmp; pNode = stack->top->next; while(pNode != NULL){ //遍历栈,释放每一块节点内存 tmp = pNode; //记录下要释放的内存地址 pNode = pNode->next; //下一个节点的地址 free(tmp); } } //销毁栈 void Destroy(Stack* stack){ Clean(stack); //先清空栈,释放内存 free(stack->top); //释放 } //压栈 void Push(Stack* stack,Node* node){ /* *说明:这里可以有另一种更好的做法 * 分配一块Node 大小的内存,然后将node中的数据复制到该内存处 * 本函数从简,没有采用这种做法 */ node->next = stack->top->next; //入栈节点 next指向原栈第一个节点 stack->top->next = node; //栈顶top指向该入栈节点 } //弹栈 Node* Pop(Stack* stack){ Node* del= NULL; del = stack->top->next; if(del != NULL){ //非空 stack->top->next = del->next; //指向第二个节点(可能为NULL) } return del; } //栈长度 int Length(Stack* stack){ int i = 0; Node* pNode; pNode = stack->top->next; //指向栈的第一个节点 while(pNode != NULL){ i++; pNode = pNode->next; } return i; } //显示栈节点 void NodeDisplay(Node* node){ /* *说明:当节点的数据类型不是int类型时 * 重写该函数 */ printf("value = %d/n",node->value); } //显示栈 void StackDisplay(Stack* stack){ Node* pNode; pNode = stack->top->next; //第一个事件 while(pNode != NULL){ //空表 NodeDisplay(pNode); pNode = pNode->next; } } //--------------------------主函数------------------------------------------------ void main(){ Stack* linkStack; Node* node1,*node2,*node3,*node4,*node5; node1 = (Node*)malloc(sizeof(Node)); node2 = (Node*)malloc(sizeof(Node)); node3 = (Node*)malloc(sizeof(Node)); node4 = (Node*)malloc(sizeof(Node)); linkStack = (Stack*)malloc(sizeof(Stack)); node1->value = 1; node2->value = 2; node3->value = 3; node4->value = 4; InitStack(linkStack); Push(linkStack,node1); printf("%d 压栈,栈长度为%d/n",node1->value,Length(linkStack)); StackDisplay(linkStack); printf("-----------------------------------/n"); Push(linkStack,node2); printf("%d 压栈,栈长度为%d/n",node2->value,Length(linkStack)); StackDisplay(linkStack); printf("-----------------------------------/n"); node5 = Pop(linkStack); printf("%d 弹栈,栈长度为%d/n",node5->value,Length(linkStack)); printf("",Length(linkStack)); StackDisplay(linkStack); printf("-----------------------------------/n"); Push(linkStack,node3); printf("%d 压栈,栈长度为%d/n",node3->value,Length(linkStack)); StackDisplay(linkStack); printf("-----------------------------------/n"); Push(linkStack,node4); printf("%d 压栈,栈长度为%d/n",node4->value,Length(linkStack)); StackDisplay(linkStack); printf("-----------------------------------/n"); }