数据结构 栈 入栈 输出 出栈

数据结构 栈 入栈 输出 出栈

#include<bits/stdc++.h>
/*
#include<iostream>
#include<>
*/
using namespace std;
//pA->p(Next)=pB->p(top)含义是pA指向pB
typedef struct Node//有节点的数据类型 
{
	int data;//数据域
	struct Node * pNext; 
	
}NODE,*PNODE; 

typedef struct Stack//栈 
{
	PNODE pTop;// 栈顶 
	PNODE pBottom;//栈底 
} STACK,*PSTACK;

//声明 可用不用写形参,但要写数据类型 
void init(PSTACK);//这是指针即地址 
void push(PSTACK,int);//不用返回值,不存在满,一定会成功 
void traverse(PSTACK);//不用返回值,遍历把栈s发就行
bool empty( PSTACK pS); 
bool  pop(PSTACK,int*); //出栈,只要一个栈的地址就行 ,数值是*pVal要用指针传递,指针变量在栈中操作 
//返回类型是什么,要是函数里面有输出,不用int,函数会有成功失败用bool 


int main()
{
	int val;
	STACK S; 
	// 先造一个空栈 
	init(&S);//必须写s的地址,不然不能改变 
	push(&S,1);//入栈 
	push(&S,2);
	push(&S,3);
	traverse(&S);
	if( pop(&S,&val))//一定注意这是地址& 
	{
		cout<<"出栈成功,值是:"<<val; 
	}
	else
	{	
		cout<<"出栈失败"<<endl; 
	}
	

	return 0;
} 



void init(PSTACK ps)//这是指针即地址 
{
	//为什么结构体可以指向结构体内部成员:ps形参的数类型是PSACK栈指针 
	//造出一个点,把地址给pTop指针 即pS栈的pTop指向新的点 
	ps->pTop = (PNODE)malloc(sizeof(NODE));
	if( NULL==ps->pTop)
	{
		cout<<"动态内存分配失败"<<endl;
		exit(-1); //直接终止 
	}
	else
	{
		//顶底指向了同一个头节点,这个头节点指针域是空 
		ps->pBottom=ps->pTop;//顺序不能反,底指向顶,即底也指向新的点 
		ps->pBottom->pNext =NULL;//ps所指向的pBtoom成员指向的指针域是空的 
	} 
	
	ps->pBottom;
	
}

void push(PSTACK pS,int val)
{
	//先注意1pS是栈2pNew是新点的指针地址3指针域是->pNext
	//pA->p(Next)=pB->p(top)含义是pA指向pB 
	//入栈,先造一个点
	PNODE pNew=(PNODE)malloc(sizeof(NODE)); 
	pNew->data=val;//值存入新点 
	pNew->pNext=pS->pTop;//新点的指针域 指向未插入节点前 pS栈的顶,这里只能是top
	pS->pTop=pNew; //pS栈的top指针指向新的点 
	
	return;
}

void traverse(PSTACK pS)
{
	//先定义一个指针p 
	PNODE p= pS->pTop;
	
	while ( p!=pS->pBottom 	)
	{
		cout<<p->data<<endl;
		p=p->pNext;//p后移 
	}
	return;
}



//判断是否是空,要返回是否bool,要形参栈 
bool empty( PSTACK pS)
{
	if( pS->pTop==pS->pBottom )
		return true;
	else
		return false; 
}


//出栈即删除  把ps所指的栈出栈一次,并把出栈的元素存入pVal形参所指的变量中,出栈成功 
bool  pop(PSTACK pS,int *pVal)
{
	if( empty(pS ) ) //要传地址,但ps本身就是指针即地址 
		return false;//不能出栈返回false,试试能不能输出 不能出栈 
	else
		//出栈即删除元素,先用新指针r把这个点保存起来,在top指向top下一个, free(r) 
	{
		PNODE r=pS->pTop;  //造一个新指针r放现在的top 
		*pVal=r->data;//*pVal是pval指向的变量,把r的值放入 
		
		pS->pTop=pS->pTop->pNext;//top指向top下一个
		free(r);//释放r 
		r=NULL;
		//pBottom不用变,一直在底 
		return true;
	}
	
}

结果

在这里插入图片描述

如果对你有帮助,请 点赞 支持一下

  • 9
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值