栈——顺序栈和链式栈

目录

顺序栈

1、初始化顺序栈 

2、判栈空

3、进栈

4、出栈

5、读栈顶元素

6、遍历

链式栈

1、初始化链式栈

2、断链式栈是否为空判

3、入栈(插入)

​编辑​编辑

4、出栈(删除)

5、读取栈顶元素

6、输出链式栈中各个节点的值(遍历)


作为一种数据结构,是一种只能在同一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,最先进入的数据被压入栈底,最后进入的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)也就是后进先出(LIFO)或者先进后出(FILO)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。

1.什么是栈,我们引用图例来帮助理解:

顺序栈

1、初始化顺序栈 
SqStack *initStack(){
	SqStack *s; 
	s = (SqStack*)malloc(sizeof(SqStack)); //划分内存空间
	if(!s){//判断内存空间的划分是否成功
        printf("空间不足\n");
        return NULL;
    }else{
        s->top = -1;//栈空以-1标记
        return s;  //返回栈
    }
}
2、判栈空
//判栈空
int stackEmpty(SqStack *s){	
	if(s->top==-1){         
		return 1;       
	}else{
		return 0;      
	}
}
3、进栈
//进栈 
int push(SqStack *s,datatype x){//入栈操作,s代表栈,x代表我们入栈的值 
	if(s->top==MAXSIZE-1)
    {
		printf("\nThe squence stack is full!");
		return 0;
	}else{
		s->data[++s->top]=x;//指针先加一,在入栈 
		return 1; 
	}		    
} 
4、出栈
//出栈 
int pop(SqStack *s,datatype *x){//出栈操作,s代表栈,指针x代表输出的值,指针实参为地址
	if(stackEmpty(s))          //栈空,报错 
	{
		printf("\nThe squence stack is empty!");
		return 0;
	}else{
	    *x=s->data[s->top--];//先出栈,指针在减一 
	    return 1;
	}	    
} 
5、读栈顶元素
//读栈顶元素 
int getTop(SqStack *s){
	if(stackEmpty(s))          //栈空,报错 
	{
	    printf("\n栈是空的!");
		exit(1);
	}else{
		return s->data[s->top];
	} 
}
6、遍历
//遍历 
int display(SqStack *s){
    int i;
    printf("当前栈中的元素:\n");
    for(i = s->top; i >= 0; i--)
        printf("%3d", s->data[i]);
    printf("\n");
    return 0;
}

链式栈

链式栈是一种数据存储结构,可以通过单链表的方式来实现。

优点在于它能够克服用数组实现的顺序栈空间利用率不高的特点,且除了存放每个栈元素的数据域,还需要额外分配指针空间用来存放指针的指针域。也就是有一个栈顶指针,指向了一个单链表,单链表存数据,栈顶指针取,放数据。

什么是链式栈?

链式栈,其实和单链表很相似,进栈可以理解为单链表的头插法,出栈可以理解为带头结点的单链表输出,只不过它的头结点就是我们的栈顶,栈顶用来输入和输出。

1、初始化链式栈
//初始化链式栈
int initStack() {
    return  NULL;
}
2、断链式栈是否为空判
//判断链式栈是否为空
int isEmpty(LinkStack *top) {
    return (top?0:1); //栈空返回 1
}
3、入栈(插入)
//入栈(插入)
LinkStack *push(LinkStack *top,datatype x){
    LinkStack *p;
	p = (LinkStack*)malloc(sizeof(LinkStack));//分配空间
    p->data = x;      //设置新结点的值
    p->next = top;   //将新元素插入栈中
    top = p;          //将新元素设为栈顶
    return top;
}
4、出栈(删除)
//出栈(删除)
LinkStack *pop(LinkStack *top,datatype *x) {
	LinkStack *q;
    if(!top){printf("栈为空,无法出栈!\n");return NULL;}
    q = top;         //指向被删除的栈顶  
    *x=q->data;      //返回我们出栈的值 
    top = top->next;   //修改栈顶指针
    free(q);         //释放已经出栈的结点
    return top;
}
5、读取栈顶元素
//读取栈顶元素
int getTop(LinkStack *top) {
    if (!top) {
        printf("栈为空,无法读取栈顶元素!\n");
        return 0;
    }
    return top->data;//返回栈顶的值
}
6、输出链式栈中各个节点的值(遍历)
//输出链式栈中各个节点的值
void display(LinkStack *top) {
    LinkStack *p = top;
    if (!p) {printf("栈为空,无法读取栈顶元素!\n");}
    while (p) {
        printf("%3d ", p->data);
        p = p->next;
    }
    printf("\n");
}

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值