栈的一些简单操作

本文深入浅出地介绍了链式栈的基本概念与实现细节,包括结构体定义、初始化、入栈、出栈等核心操作,并提供了完整的C语言实现代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我觉得栈应该应用是很多的吧,不过现在说的栈只有基本的操作,知道她了解她。

栈就是一个先进后出的链表,我说的是链式栈哈。我觉得顺序栈应该叫压箱子,链式栈该叫码砖。因为顺序栈代表有固定的深度,链式栈随便多长。

入栈就是一个一个的压,每个节点指向刚刚她压住的那一个。我觉得就是初始化能够理解了,出入栈的操作很简单的。

我觉着越简单的数据结构就要越理解深一点(完全理解不知道该是啥程度),因为以后很多东西都是从这些结构里延伸出来的。

差不多贴结构体了:

typedef struct Node{
    datatype data;//数据域
    struct Node *pNext;//指针域
}Node, *pNode;

typedef struct Stack {
    pNode Top;//栈顶
    pNode Bottom;//栈底
    
}Stack,*pStack;

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

typedef int datatype ;
typedef struct Node{ 
	datatype data;//数据域
	struct Node *pNext;//指针域
}Node, *pNode;

typedef struct Stack {
	pNode Top;//栈顶
	pNode Bottom;//栈底
	
}Stack,*pStack;

void Init(pStack ps);//初始化
bool isEmpty(pStack ps);//是否为空
void push(pStack ps, datatype item);//入栈
void Traverse(pStack ps);//遍历
bool pop(pStack ps,datatype *item);//出栈

//=======================================
//初始化
void Init(pStack ps) {
	pNode pNew  = (pNode )malloc(sizeof(Node));//创建新节点
	if(!pNew) 
		exit(-1);
	ps->Top = pNew ;//将新节点赋给顶和底
	ps->Bottom = pNew;//最终的栈底是没有存数据的
	ps->Top->pNext = NULL;//没数据 指向空
	return ;
}//Init
//==========================================
//是否为空
bool isEmpty(pStack ps) {
	if(ps->Top == ps->Bottom)
		return true;
	else
		return false;
}//isEmpty
//==========================================
//入栈
void push(pStack ps, datatype item) {
	pNode pNew = (pNode )malloc(sizeof(Node));
	if(!pNew) 
		exit(-1);
	pNew->data = item;//新节点
	pNew->pNext = ps->Top ;//指向栈顶
	ps->Top = pNew;//把新节点作为栈顶
	return ;
}//push
//============================================
//遍历
/*
不能这样写
	while(ps->Top != ps->Bottom) {
		printf("%d ",ps->Top->data);
		ps->Top = ps->Top->pNext;//遍历的目的在于输出节点值,这样等于间接清空栈
	}

*/
void Traverse(pStack ps) {
	pNode temp = ps->Top ;
	while(temp != ps->Bottom ) {//未到栈底
		printf("%d ",temp->data );//换datatype的时候%d记得改
		temp = temp->pNext ;
	}//while
	return ;
}//Traverse
//==============================================
//出栈
void pop(pStack ps,datatype &item) {
	if(isEmpty(ps)) {
		printf("空栈!\n");
		return ;
	}
	pNode temp = ps->Top ;
	item = temp->data ;// 获取出栈的数据
	ps->Top = temp->pNext ;//将栈顶的下一个节点作为栈顶
	free(temp);//释放空间
	temp = NULL ;
}//pop

//======================================
//测试程序
int main() {
	Stack s;
	int item;
	Init(&s);
	pop(&s,item);

	push(&s,1);
	push(&s, 2);
	push(&s, 3);
	push(&s, 4);
	push(&s,5);
	Traverse(&s);
	printf("\n");

	pop(&s,item);
	printf("出栈的是%d \n",item);
	while(!isEmpty(&s)) {
		pop(&s,item);
		printf("出栈的是%d \n",item);
	}
	Traverse(&s);
	
	return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值