实现栈的ADT(C++)

目录

思考:(1)为什么void InitStack(LinkStNode *&s)要加*?

(2)为什么void InitStack(LinkStNode *&s)要加&?


 

#include <bits/stdc++.h>

typedef struct linknode{
	int data;
	struct linknode *next;
}LinkStNode;//进行二次定义

void InitStack(LinkStNode *&s);
bool StackEmpty (LinkStNode *s);
void push(LinkStNode * &s,int e);
bool Pop(LinkStNode *&s,int &e);

main(){
	LinkStNode *s;
	int e;
	
	InitStack(s);
	
	push(s,1);
	push(s,3);
	push(s,5);
	
	
	while(!StackEmpty(s)){
		Pop(s,e);
		printf("%4d",e);
	}
	
} 

void InitStack(LinkStNode *&s){
	/* 对s有返回值,对s的改变能直接改变s,
	   返回s,所以是&s
	*/
	//创建一个栈
	s=(LinkStNode *)malloc(sizeof(LinkStNode));
	//新建一个节点 
	s->next = NULL; 
}

bool StackEmpty (LinkStNode *s){
	//判断栈是否为空 
	bool flag;
	
	if(s->next == NULL){
		flag=true;
	}else{
		flag=false;
	}
	
	return flag;
}

void push(LinkStNode * &s,int e){
	//把e插入到栈s中,作为栈顶元素
	 LinkStNode *p;
	 
	 //新建一个结点p;用来存放e 
	 p=(LinkStNode *)malloc(sizeof(LinkStNode));
	 p->data=e;
	 
	 //把p插入到头结点之后 
	 p->next=s->next;
	 s->next=p;
} 

bool Pop(LinkStNode *&s,int &e){
	//栈不为空时,取首结点的data赋值给e,
	//然后将其删除 
	LinkStNode *p;
	bool flag;
	
	flag=true;
	
	p=s->next;
	
	if(!StackEmpty(s)) {
		s->next=p->next;
		e=p->data;
	}else{
		flag=false;
	}
	
	return flag;
}

思考:(1)为什么void InitStack(LinkStNode *&s)要加*?

通过添加*符号,我们明确指定了参数s的类型为指针类型,并将其作为指针引用传递给函数,以便在函数内部修改指针所指向的对象。

在函数声明InitStack(LinkStNode *&s)中,*符号用于指定参数s的类型为指针类型。这意味着s将被用作指向LinkStNode类型对象的指针。

在函数定义中,参数s的类型被指定为LinkStNode *&,表示这是一个指向指针的引用。通过使用*符号,我们表明参数s是一个指向指针的引用,而不是一个普通的指针或变量。

为什么要使用指针引用作为参数类型呢?这是因为我们希望在函数内部修改指针s所指向的对象,而不仅仅是修改指针本身。通过使用指针引用作为参数类型,函数可以修改原始指针变量,而这些更改将在函数外部可见。

具体到InitStack函数,我们希望在函数内部分配内存并更新指针s,使其指向新创建的栈对象。通过使用指针引用作为参数类型,函数可以修改原始指针s,并使其指向新分配的内存空间。如果不使用指针引用,函数将仅修改参数s的副本,而不会对原始指针产生任何影响。

(2)为什么void InitStack(LinkStNode *&s)要加&?

改变s。

在函数声明InitStack(LinkStNode *&s)中,&符号用于指定参数s的传递方式为引用传递。它表示将参数s作为引用传递给函数,而不是通过值传递或指针传递。

引用传递允许函数直接操作原始变量,并将对变量的修改反映到函数外部。通过引用传递,函数可以获得对原始变量的访问权限,而不是操作变量的副本。

InitStack函数中,我们希望在函数内部分配内存并更新指针s,使其指向新创建的栈对象。通过使用引用传递,我们可以直接修改原始指针变量s的值,而这些修改将在函数外部可见。如果不使用引用传递,函数将获得指针s的副本,对副本进行的任何修改都不会影响原始指针。

因此,通过添加&符号,我们指定了参数s的传递方式为引用传递,这样函数可以直接修改原始指针s,并将这些修改反映到函数外部。这样做可以确保在函数执行完毕后,原始指针s将指向新分配的内存空间。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值