数据结构 : 顺序栈和链栈(C语言)

代码实现了栈的增删改查基本操作。

顺序栈

#include<stdio.h>
#define MAXSIZE 8
typedef int XX;

typedef struct{
	XX *top;
	XX *base;
	int letter;
}stack;

//初始化
void makenew(stack &L){
	L.letter = MAXSIZE;
	L.base = new XX[MAXSIZE];
	L.top = L.base;
}

//入栈,要判栈是否满
void setdata(stack &L,XX data){
	if(L.top-L.base==L.letter){
		printf("此时栈已满。");
		return ;
	}
	*L.top=data;
	*L.top++;
}

//出栈
XX gettop(stack &L){
	if(L.base==L.top){
		printf("此时栈空。");
		return 0;
	}
	XX w;
	w=*(--L.top);
	return w;
}

//取栈顶元素
XX appeartop(stack &L){
	if(L.base==L.top){
		printf("此时栈空");
		return 0;
	}
	return *(L.top-1);
}

//显示栈内元素
void appear(stack L){
	printf("栈内元素为:\n\t");
	XX *node;
	node=L.base;
	while(node!=L.top){
		printf("%d\t",*node);
		*node++;
	}
	printf("\n");
}
void main(){
	int ruler,ii;		//ruler记录元素长度,ii记录每次输入的操作数。
	XX data;			//入栈数据
	XX atop,top;		//出栈和取栈顶元素

	stack L;
	makenew(L);
	printf("请输入您要入栈的元素的个数\n");
	scanf("%d",&ruler);
	printf("请输入元素:\n");
	for(int i=0;i<ruler;i++){
		scanf("%d",&data);
		setdata(L,data);
	}
	appear(L);
	printf("----------------------------------------------\n\n");

	printf("1入栈\t2出栈\t3取栈顶元素\t4显示栈内元素,由底到顶\t其他数字为退出\n");
	scanf("%d",&ii);
	printf("----------------------------------------------\n\n");
	while(ii){
		
		if(ii==1){
			printf("请输入您要放入的元素:\n");
			scanf("%d",&data);
			setdata(L,data);
		}
		else if(ii==2){
			top=gettop(L);
			printf("取出元素为%d\n",top);
		}
		else if(ii==3){
			atop=appeartop(L);
			printf("栈顶元素为%d\n",atop);
		}
		else if(ii==4)
			appear(L);
		else
			break;
		printf("----------------------------------------------\n\n");
		printf("请输入接下来的操作数:\n");
		scanf("%d",&ii);
	}
}


链栈

#include<stdio.h>
#include<stdlib.h>
typedef int XX;

typedef struct Lnode{
	XX data;
	struct Lnode *next;
}Lnode,*linkLnode;

//入栈
void settop(linkLnode &L,XX data){
	Lnode *e;
	e=(Lnode *)malloc(sizeof(Lnode));
	e->next = L->next;
	L->next=e;
	e->data=data;
}

//出栈
XX gettop(linkLnode &L){
	XX w;
	Lnode *p;
	if(L->next==NULL){
		printf("此时栈空,无元素");
		return 0;}
	p=L->next;
	w=p->data;
	L->next=L->next->next;
	free(p);
	return w;
}


//取栈顶元素
XX havetop(linkLnode L){
	if(L->next==NULL){ 
		printf("此时站内无元素。\n");
		return 0;
	}
	return L->next->data;
}

//显示栈内元素
void appear(linkLnode L){
	if(L->next==NULL){
		printf("栈空\n");
		return;}
	Lnode w;
	w = *L->next;
	printf("站内从顶到底的元素依次为:\n\t");
	while(w.next!=NULL){
		printf("%d\t",w.data);
		w=*w.next;
	}
	printf("%d\n",w.data);
}


void main(){
	int ruler;
	XX data;

	linkLnode L;
	L=(Lnode *)malloc(sizeof(Lnode));
	L->next=NULL;
	printf("*****************************************\n");
	printf("请输入您想输入的元素个数:\n");
	scanf("%d",&ruler);
	printf("请输入数据元素\n");
	for(int i=0;i<ruler;i++){
		scanf("%d",&data);
		settop(L,data);
	}
	printf("创建成功,");
	appear(L);
	printf("\n----------------------------------------");
	int ii;
	printf("\n1入栈\t2出栈\t3取栈顶元素\t4显示栈内元素\n\n");
	printf("请输入您想要的操作数:\n");
	scanf("%d",&ii);
	while(ii){
		
		if(ii==1){
			printf("请输入您想入栈的元素:\n");
			scanf("%d",&data);
			settop(L,data);
		}
		else if(ii==2){
			XX hh=gettop(L);
			printf("取出的元素为:%d\n",hh);
		}
		else if(ii==3){
			XX hhh=havetop(L);
			printf("栈顶元素为:%d\n",hhh);
		}
		else if(ii==4)
			appear(L);
		else
			break;
		printf("----------------------------------------\n");
		printf("请输入您想要的操作数:\n");
		scanf("%d",&ii);
	
	}
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值