对链栈的认识

了解了数据结构栈的基本知识

①先进后出,类似于装羽毛球筒和弹夹装子弹并且打出

②操作包括入栈,出栈,打印栈,检查栈顶元素,初始化栈结构体和栈结点结构体的操作

③注意事项:不同结构体指针赋值时强制类型转换的必要性,函数与主函数之间用指针连接修改的操作

④封装的思想:程序开始初始化一个空栈并且封装一个函数用来专门创造一个新结点使程序简介

⑤如何操作一个指针变量?

int a=10;
int *p=&a;
*p=50;//操作指针方法1

int *p=(int*)malloc(sizeof(int));
*p=50;//操作指针方法2

⑥想更好理解数据结构,要对函数地址传值和指针有一定理解,也要对结构体指针如何操作熟悉

接下来是代码,如有异议或发现错误欢迎指正

#include<iostream>
#include<stdlib.h>
using namespace std;

struct Stack{//定义栈的数据,包括栈的长度和它的栈顶地址
	int size;
	struct Stack*topaddress;
};

struct ListNode{//栈中的结点,这里用链式结构的链表表示
	int data;
	struct ListNode*next;
};

void myStack(struct Stack *StackTop){//初始化一个栈
	StackTop->size=0;
	StackTop->topaddress=NULL;
}

struct ListNode*creatANode(int data){//封装一个创造的新结点
	struct ListNode*newnode=(struct ListNode*)malloc(sizeof(struct ListNode));
	newnode->data=data;
	newnode->next=NULL;
	return newnode;
}

void add(struct Stack*myStack,int data){//入栈
	struct ListNode*newnode=creatANode(data);
	newnode->next = (struct ListNode*)myStack->topaddress;
	myStack->topaddress=(struct Stack*)newnode;
	myStack->size++;
}

int getTopAddressVal(struct Stack*myStack){//获取栈顶元素
	if(myStack->topaddress==NULL){
		printf("栈为空,取失败了,接下来函数返回栈的长度0");
		return myStack->size;
	}
	struct ListNode*tem=(struct ListNode*)myStack->topaddress;
	return tem->data;
}

void pop(struct Stack*myStack){//弹出栈一个元素
	if(myStack->topaddress==NULL){
		printf("栈为空,弹出失败");
		return;
	}
	struct ListNode*tem=(struct ListNode*)myStack->topaddress;
	tem=tem->next;
	myStack->topaddress=(struct Stack*)tem;
	myStack->size--;
}

void print(struct Stack*myStack){//打印栈
	if(myStack->topaddress==NULL){
		printf("栈空,结束");
		return ;
	}
	struct ListNode*head=(struct ListNode*)myStack->topaddress;
	while(head){
		printf("%d ",head->data);
		head=head->next;
	}
		printf("栈空,结束");
	return ;
}

int main(){
	struct Stack Stack1;
	//struct Stack *S1=&Stack1;
	myStack(&Stack1);
	add(&Stack1,10);
	add(&Stack1,20);
	add(&Stack1,30);
	add(&Stack1,40);
	add(&Stack1,50);
	int lookFor;
	lookFor=getTopAddressVal(&Stack1);
	cout<<"现在栈顶元素是"<<lookFor <<endl;
	pop(&Stack1);
	lookFor=getTopAddressVal(&Stack1);
	cout<<"现在栈顶元素是"<<lookFor <<endl;
	print(&Stack1);
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小狗明明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值