2021-11-03

顺序栈 、链栈

顺序栈基本操作:

#include<stdio.h>
#include<stdlib.h>
#define SElemType int
#define maxsize 100
#define Status int
//如果实参传递的是一个地址,那么形参接收后对其本身进行更改
//如果实参传递的是一个变量,那么形参接受后是对他的副本作修改
//如果实参传递的是变量,但形参接受时是 “&变量” 这种形式,那么接收到的还是这个变量的地址,修改是对其本身数据更改 
typedef struct{
	SElemType *base;
	SElemType *top;
	int stacksize;
}SqStack;

Status InitStack(SqStack &S){
	S.base = new SElemType[maxsize];     ///构建了一个大小为maxsize的内存空间,相当于是一个数组,只能存储SElemType的数据类型,并将基地址赋值给了base指针 
	if(!S.base) {
		printf("内存分配失败!\n");
		return 0;
	}
	S.top = S.base;
	S.stacksize = maxsize;
	return 1;
}
Status PushElem(SqStack &S,SElemType e){
	//插入元素e为新的栈顶元素
	if(S.top-S.base==S.stacksize){
		return 0;
	}
	*S.top++ = e;
		return 1;
}
Status PopElem(SqStack &S,SElemType &e){
	if(S.top == S.base) return 0;
	e = *(--S.top);
	return 1;
	}
void Push(SqStack &S){
	int num;
	int flag;
	SElemType e;
	printf("请输入你要插入的元素的个数:\n");
	scanf("%d",&num);
	for(int i =0;i<num;i++){
		printf("请输入第%d位元素\n",i+1);
		scanf("%d",&e);
		flag = PushElem(S,e);
		if(flag)
		{
			printf("%d已入栈!\n",e);
		}
		else{
			printf("栈已满!\n");break;	
		}
	}
}
void Pop(SqStack &S){
	int num;
	int flag;
	SElemType e;
	printf("请输入你要出栈的元素个数:\n");
	scanf("%d",&num);
	for(int i =0;i<num;i++){
		flag = PopElem(S,e);
		if(flag)
		{
			printf("%d已出栈!\n",e);
		}
		else{
			printf("栈已空!\n");break;	
		}
	}
}
void GetTop(SqStack &S){
	//返回S 的栈顶元素,不修改栈顶指针
	if(S.top!=S.base)
	{
		printf("栈顶元素为%d\n",*(S.top-1));
	 } 
}
menu(){
	printf("***************\n");
	printf("1.入栈\n");
	printf("2.出栈\n");
	printf("3.取栈顶元素\n");
	printf("4.退出\n");
	printf("***************"); 
} 
int main(){
	SqStack S;
	InitStack(S);
	while(1){
		menu();
		int choice;
		printf("请选择操作菜单:\n");
		scanf("%d",&choice);
		if(choice == 4) break;
		switch(choice){
			case 1:Push(S); break;
			case 2:Pop(S); break;
			case 3:GetTop(S);break; 
			default:printf("输入错误!!\n");
		}
	}
	return 0;
} 

在这里插入图片描述
链栈基本操作:

#include<stdio.h>
#include<stdlib.h>
#define SElemType int
#define maxsize 100
#define Status int

typedef struct StackNode{
	SElemType data;
	struct StackNode *next;
}StackNode,*LinkStack; 

Status InitStack(LinkStack &S){
	//构造一个空栈S,栈顶指针为空,栈链没有头结点
	S = NULL;
	return 1; 
}

Status PushElem(LinkStack &S,LinkStack &p,SElemType &e){
	p = new StackNode;
	p->data = e;
	p->next = S;
	S = p;
	return 1;
}
Status PopElem(LinkStack &S,LinkStack &p,SElemType &e){
	if(S==NULL) return 0;   //栈空
	e = S->data;
	p = S;
	S = S->next;
	free(p);
	return 1;
 }
void Push(LinkStack &S,LinkStack &p){
	int flag;
	int n;
	SElemType e;
	printf("请输入你要入栈几个数据:\n");
	scanf("%d",&n);
	for(int i = 0;i<n;i++){
		printf("请输入你要插入的第%d的数据是:\n",i+1);
		scanf("%d",&e);
		PushElem(S,p,e);
		if(flag){
			printf("%d入栈成功!\n",e);
		}else{
			printf("入栈失败!\n");
		}
	}
	
}
void Pop(LinkStack &S,LinkStack &p){
	int num;
	int flag;
	SElemType e;
	printf("请输入你要出栈的元素个数:\n");
	scanf("%d",&num);
	for(int i =0;i<num;i++){
		flag = PopElem(S,p,e);
		if(flag)
		{
			printf("%d已出栈!\n",e);
		}
		else{
			printf("栈已空!\n");break;	
		}
	}
}
void GetTop(LinkStack &S){
	if(S!=NULL){
		printf("栈顶元素为%d\n",S->data);
	}
}
menu(){
	printf("***************\n");
	printf("1.入栈\n");
	printf("2.出栈\n");
	printf("3.取栈顶元素\n");
	printf("4.退出\n");
	printf("***************"); 
} 
int main(){
	LinkStack S;
	LinkStack p;
	InitStack(S);
	while(1){
		menu();
		int choice;
		printf("请选择操作菜单:\n");
		scanf("%d",&choice);
		if(choice == 4) break;
		switch(choice){
			case 1:Push(S,p); break;
			case 2:Pop(S,p); break;
			case 3:GetTop(S);break; 
			default:printf("输入错误!!\n");
		}
	}
	return 0;
} 

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值