单链表结合结构体 实现栈的操作

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

#define OK 1
#define ERROR 0

typedef int Status;

typedef struct snode{
	int data;
	struct snode* next;
}snode;

typedef struct linkstack{
	snode* top;
	snode* bottom;
	int length;
}linkstack;

Status creat(linkstack* S){//创建一个空栈 
	S->top=S->bottom=(snode*)malloc(sizeof(snode));
	if(!S->top){
		printf("申请空间失败!\n");
		return ERROR;
	}
	S->top->next=NULL;
	S->bottom->next=NULL;
	S->length=0;
	return OK; 
}

bool empty(linkstack S){//判断栈是否为空  
	return !S.length;
}

int size(linkstack S){//返回栈的大小  
	return S.length;
}

Status push(linkstack* S,int e){//元素入栈  
	snode* newx=(snode*)malloc(sizeof(snode));
	if(!newx){
		printf("申请空间失败!\n");
		return ERROR;
	}
	newx->data=e;
	newx->next=S->top->next;
	S->top->next=newx;
	if(!S->length)
		S->bottom=S->bottom->next;
	S->length++;
	return OK;
}

Status pop(linkstack* S){//弹出栈顶元素  
	if(!S->length){
		printf("当前栈已经为空!\n");
		return ERROR;
	}
	snode* del=S->top->next;
	S->top->next=del->next;
	free(del);
	S->length--;
	return OK;
}

Status gettop(linkstack S,int &e){//获得栈顶元素 存到e中  
	if(!S.length){
		printf("当前栈为空!\n");
		return ERROR;
	}
	e=S.top->next->data;
	return OK;
}

Status show(linkstack S){//输出当前栈的内容  
	if(!S.length){
		printf("空!\n");
		return ERROR;
	}
	snode* p=S.top->next;
	while(p){
		printf("%d ",p->data);
		p=p->next;
	}
	printf("\n");
	return OK;
}

Status clear(linkstack *S){//清空栈  
	while(S->top->next)
		pop(S);
	return OK; 
}

Status destroy(linkstack* S){//销毁当前栈  
	snode* del;
	while(S->top){
		del=S->top;
		S->top=S->top->next;
		free(del);
	}
	S->top=S->bottom=NULL;
	return OK;
}


void menu(){
	printf("\t\t\t\t**********链栈操作程序**********\n");
	printf("\t\toptions:\n");
	printf("\t\t\t1、搭建一个栈\n");
	printf("\t\t\t2、向当前栈中压入元素\n");
	printf("\t\t\t3、输出当前栈的内容\n"); 
	printf("\t\t\t4、输出栈顶元素\n");
	printf("\t\t\t5、弹出栈顶元素\n");
	printf("\t\t\t6、查询当前栈的元素数目\n");
	printf("\t\t\t7、判断当前栈是否为空\n");
	printf("\t\t\t8、清空栈的内容\n"); 
	printf("\t\t\t9、销毁当前栈\n");
	printf("\t\t\t0、退出对栈的操作\n"); 
	printf("\t\t请输入你的选项: "); 
}

int main()
{
	linkstack S;
	creat(&S);
	while(1){
		menu();
		int op;
		int n,m;
		int e;
		scanf("%d",&op);
		switch(op){
			case 0:{
				system("cls");
				printf("\t\t\t谢谢您的操作,再见!\n");
				exit(0);
				break;
			} 
			case 1:{
				system("cls");
				creat(&S); 
				printf("\t\t\t搭建成功!\n");
				break;
			}
			case 2:{
				system("cls");
				printf("\t\t\t请输入要将几个元素入栈:");
				scanf("%d",&n);
				printf("\t\t\t输入%d个需要入栈的元素:",n);
				while(n--){
					scanf("%d",&e);
					push(&S,e);	
				}
				system("cls");
				printf("\t\t元素入栈成功!\n"); 
				break;
			}
			case 3:{
				system("cls");
				printf("\t\t\t当前栈的内容为:\n\t\t\t");
				show(S);
				break;
			}
			case 4:{
				system("cls");
				if(gettop(S,e))
					printf("\t\t\t当前栈顶元素为 %d\n",e); 
				break;
			}
			case 5:{
				system("cls");
				pop(&S);
				printf("\t\t\t栈顶元素弹出成功\n"); 
				break;
			}
			case 6:{
				system("cls");
				printf("\t\t\t当前栈的元素数目为%d个\n",size(S));
				break;
			} 
			
			case 7:{
				system("cls");
				if(empty(S))
					printf("\t\t\t当前栈为空!\n");
				else printf("\t\t\t当前栈不为空!\n");
				break;
			}
			case 8:{
				system("cls");
				clear(&S);
				printf("\t\t\t当前栈已经被清空!"); 
				break;
			} 
			case 9:{
				system("cls");
				destroy(&S);
				break;
			}
			
			default:
				system("cls");
				printf("\t\t你的输入有误,请重新输入!!!\n"); 
				break;
		}
		printf("\n"); 
	}
	return 0;
} 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值