#include "stdio.h"
#include "string.h"
#include "malloc.h"
// SqStack 顺序栈
#define MAXSIZE 10 // 注意这里不是一个表达式 不能写成xx=xx; 的形式 没有= 也没有;
typedef struct SqStack{
int stack[MAXSIZE];
int top;
} ;
typedef struct LinkStackNode{
int value;
LinkStackNode *next;
};
bool createStack(SqStack **p );
void push(SqStack *p,int value); // 入栈
int pop(SqStack *p); // 出栈
bool createLinkStackNode(LinkStackNode **p );
void push(LinkStackNode *p,int value);
void push2(LinkStackNode **top,int value);
int pop(LinkStackNode *p);
int pop2(LinkStackNode **top);
void main(){
SqStack *s;
createStack( &s );
push(s,11);
pop(s);
//我的链式栈是记录下了最下面的节点 放新节点的时候从最底下数到最上面
//我的是最低下的节点next 次底下 最后next到最上面
//这样并不好 因为对于栈的操作就是在最顶上进行的
//从最顶上添加元素 删除元素
//故应该记录下最顶的指针
LinkStackNode *l;
createLinkStackNode( &l);
push(l,22);
push(l,23);
push(l,24);
push(l,25);
int n=pop(l);
printf("%d",n );
n=pop(l);
printf("%d",n );
//接下来是书本上的做法
//书上是记录下最top的元素, 每次对栈操作后 top都会跟随着变化
//从最上面的节点 next 到次顶部的节点 再next到最下面
LinkStackNode *top;
push2(&top,11);
int pop=pop2(&top);
printf("%d",pop );
}
bool createStack(SqStack **p ){
//分配内存空间的时候 判断的是 *p是否为空
//所以要用括号把 给*p分配地址的这一段话包起来
//传入的是2级指针 这里用一个* 代表的就是要操作的变量
if ((*p=( struct SqStack *) malloc(sizeof(SqStack))) == NULL )
{
return false;
}else{
// 注意这里要用括号包括*p 否则*号就是对后面的表达式取地址
// 也就是对 p->next=NULL 取地址 显然会报错
(*p)->top=-1; // top=-1 表示还没有任何值装入
return true;
}
}
//入栈
void push(SqStack *p,int value){
if(p->top=MAXSIZE-1 ){ //栈已满 不再进栈
}else{
p->top++;
p->stack[p->top]=value;
}
}
//出栈
int pop(SqStack *p){
if(p->top=-1){ //栈已空 不再进栈
return -1;
}else{
int value=p->stack[p->top];
p->top--;
return value;
}
}
//链式栈=================================================================
bool createLinkStackNode(LinkStackNode **p ){
if ((*p=( struct LinkStackNode *) malloc(sizeof(LinkStackNode))) == NULL )
{
return false;
}else{
// 注意这里要用括号包括*p 否则*号就是对后面的表达式取地址
// 也就是对 p->next=NULL 取地址 显然会报错
(*p)->next=NULL;
return true;
}
}
void push(LinkStackNode *p,int value){
while (p->next!=NULL)
{
p=p->next;
}
LinkStackNode *n=(struct LinkStackNode *) malloc(sizeof(LinkStackNode));
n->value=value;
n->next=NULL; // 这一句千万不能忘记
p->next=n;
}
int pop(LinkStackNode *p){
while (p->next->next!=NULL)
{
p=p->next;
}
// 经过这个循环 p应该是倒数第2个
LinkStackNode *last=p->next; // !!! 这里不能写成last=p->next; 因为next的类型是一个指针型
p->next=NULL;
return last->value;
}
void push2(LinkStackNode **top,int value){
LinkStackNode *n=(struct LinkStackNode * )malloc( sizeof(LinkStackNode ) );
n->value=value;
n->next=(*top);
(*top)=n;
}
int pop2(LinkStackNode **top){
int pop=(*top)->value;
(*top)=(*top)->next;
return pop;
}