C 栈(顺序栈 链栈)

#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;
}

你可能感兴趣的:(C 栈(顺序栈 链栈))