栈的定义与操作

来源:互联网 发布:五彩斑斓的黑色 知乎 编辑:程序博客网 时间:2024/05/22 02:04

看代码理解。。

/*************************************************************************    > File Name: stack.c    > Author: Netcan    > Mail: 1469709759@qq.com     > Created Time: 2014/12/21 9:39:37 ************************************************************************/#include<stdio.h>#include<malloc.h>struct Node {  // 定义节点int data;Node * pNext;};struct Stack { // 定义栈Node *pTop; // 栈顶指针Node *pBottom; // 栈底指针};void init_Stack(Stack *S); // 初始化栈void traverse_Stack(Stack *S); // 遍历栈bool push_Stack(Stack *S,int val); // 压栈bool pop_Stack(Stack *S); // 出栈void clear_Stack(Stack *S); // 清空栈int main() {Stack S; // 声明一个栈init_Stack(&S); // 初始化push_Stack(&S,0); // 压栈测试push_Stack(&S,1);push_Stack(&S,2);push_Stack(&S,3);push_Stack(&S,4);push_Stack(&S,5);push_Stack(&S,6);push_Stack(&S,7);push_Stack(&S,8);push_Stack(&S,9);traverse_Stack(&S); // 遍历pop_Stack(&S); // 出栈测试pop_Stack(&S); traverse_Stack(&S);clear_Stack(&S); // 清空栈测试traverse_Stack(&S);return 0;}void init_Stack(Stack *S) {S->pBottom = (Node *)malloc(sizeof(Node)); // 分配一个新结点给栈顶和栈底S->pTop = S->pBottom;S->pBottom->pNext = NULL; // 栈底的不指向其他节点return;}void traverse_Stack(Stack *S) {Node * p = S->pTop;  // 遍历用的指针while( p != S->pBottom ){ // 如果没遍历到栈底printf("%3d",p->data);p = p->pNext; }puts("");}bool push_Stack(Stack *S,int val) {Node *pNew = (Node*)malloc(sizeof(Node)); // 分配一个新节点if( pNew == NULL ) // 如果分配失败return false;pNew->data = val; // 节点赋值pNew->pNext = S->pTop; // 使新节点成为栈顶 S->pTop = pNew;return true;}bool pop_Stack(Stack *S) {if(S->pTop == S->pBottom) // 如果栈为空则不必出栈return false;Node *p = S->pTop; // 使p指向栈顶,为了释放栈顶节点S->pTop = p->pNext; // 栈顶下移free(p); // 释放p = NULL;}void clear_Stack(Stack *S){//while( pop_Stack(S));  其实可以这样写。。。一直出栈直到栈为空Node * p = S->pTop; // p一直指向栈顶while( S->pTop != S->pBottom ) { // 如果栈顶还没到栈底就继续释放S->pTop = p->pNext; // 栈顶下移free(p); //释放p = S->pTop;}}

运行图:


0 0