动态栈的基本操作

#include <stdio.h>
#include <malloc.h>
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);//入栈 
void pop(PSTACk,int *);//出栈 
void printStack(PSTACk);//打印栈
void clear(PSTACk);//栈清空 
bool is_empty(PSTACk);//判断栈是否为空 
int main(void){
	//这时候已经分配了内存空间给S了,只不过是静态分配,而且是垃圾值
	//接下来要通过动态分配把里面的内容进行初始化 
	Stack S;
	int val; 
	init(&S); 
	push(&S);
	push(&S);
	push(&S);
	push(&S);
	printStack(&S); 
	pop(&S,&val);
	printf("出栈的元素为:%d\n",val); 
	printStack(&S);
	clear(&S);
	printStack(&S); 
	return 0; 
} 
//栈初始化
void init(PSTACk pS){
	pS->pTop = (PNODE)malloc( sizeof(NODE) );
	if(pS->pTop == NULL){
		printf("内存分配失败\n");
		exit(-1); 
	}	
	pS->pBottom = pS->pTop;
	pS->pTop->pNext = NULL; 
} 
//判断栈是否为空 
bool is_empty(PSTACk pS){
	if(pS->pTop == pS->pBottom){
		return true; 
	} return false; 
}
//入栈
void push(PSTACk pS){
	printf("请输入你要入栈的元素值:");
	int val;
	scanf("%d",&val);
	PNODE pNew = (PNODE)malloc( sizeof(NODE) );
	pNew->data = val; 
	pNew->pNext = pS->pTop;//因为栈是先进后出的,所以整个链表的连接方向要反着 
	pS->pTop = pNew; 
}
//打印栈元素 
void printStack(PSTACk pS){
	if(is_empty(pS) ){
		printf("栈为空,不能打印\n");
		return; 
	} 
	PNODE p = pS->pTop;
	printf("当前栈元素为:"); 
	while(p != pS->pBottom){
		printf("%d ",p->data); 
		p = p->pNext; 
	} 
	printf("\n"); 
}
//出栈
void pop(PSTACk pS,int * pVal){
	if(is_empty(pS) ){
		printf("栈为空,不能出栈\n");
		return; 
	}
	PNODE p = pS->pTop;
	*pVal = p->data; 
	pS->pTop = p->pNext;
	free(p); 
} 
//栈清空
void clear(PSTACk pS){
	if(is_empty(pS) ){
		printf("栈为空,不能清空\n");
		return; 
	}
	PNODE p = NULL;
	while(pS->pTop != pS->pBottom){
		p = pS->pTop; 
		pS->pTop = pS->pTop->pNext;
		free(p); 
	} 
} 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值