您的位置:首页 > 其它

C 栈(顺序栈 链栈)

2014-06-20 15:34 148 查看
#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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: