这次代码一波两折,本来想着堆栈这种结构只有一端进行操作,这样我只记录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");
}