数据结构学习之路6 用链表实现堆栈

来源:互联网 发布:淘宝卖家手册pdf 编辑:程序博客网 时间:2024/06/03 15:47

这次代码一波两折,本来想着堆栈这种结构只有一端进行操作,这样我只记录rear的位置就好了,就不用像链表实现的队列内样定义两个结构体,然后我就一路写,push函数直接使p指向队尾就好,结果写到pop的时候就傻眼了,我找不到上一个节点!我的指针指向着最后一个节点,那我怎么出栈呢?想了好久,一度想要写出双链表,看了别人的思路之后才发现可以倒着写,大家如果不懂我为什么说是倒着写,可以画一画这个程序的逻辑,真的很巧妙,我自愧不如,能力还需加强

本次代码的变量命名依然狗血,一股不专业的气息扑面而来…内个show函数只是我用来测试函数是否正确的,大家不用在意

接下来贴代码:

#include<iostream>using namespace std;typedef struct Stack *stack;typedef struct Fnode *fnode;struct Stack{int data;stack next;};struct Fnode{stack top;};fnode creat(){fnode p = (fnode)malloc(sizeof(Fnode));p ->top = NULL;return p;}int isEmpty(fnode p){if(p ->top == NULL)return 1;return 0;}void push(int x, fnode p){stack s = (stack)malloc(sizeof(Stack));s ->data = x;s ->next = p ->top;p ->top = s;}int pop(fnode p){if(isEmpty(p)){cout << "堆栈已空" << endl;return NULL;}stack s = p ->top;p ->top = p ->top ->next;int a = s ->data;free(s);return a;}void show(fnode p){if(isEmpty(p)){cout << "堆栈已空" << endl;return;}stack s = p ->top;while(s){cout << s ->data << endl;s = s ->next;}free(s);}void main(){fnode p = creat();push(2, p);push(3, p);push(6, p);show(p);cout << endl;pop(p);show(p);cout << endl;pop(p);show(p);cout << endl;pop(p);show(p);cout << endl;system("pause");}


原创粉丝点击