数据结构-顺序栈基本操作

代码:

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
using namespace std;
#define Status int
#define SElemType int
#define MaxSize 100
//栈数据结构
typedef struct Stack {
	SElemType *base;//栈底指针 不变
	SElemType *top;//栈顶指针 一直在栈顶元素上一个位置
	int stacksize;//栈可用的最大容量
} SqStack;
//****************************基本操作函数******************************//
//初始化函数
Status InitStack(SqStack &S) {
	S.base=new SElemType[MaxSize];//动态分配最大容量
	if(!S.base) {
		printf("分配失败\n");
		return 0;
	}
	S.top=S.base;//栈顶指针与栈底相同
	S.stacksize=MaxSize;
	return 1;
}
//销毁 
Status DestroyStack(SqStack &S) {
	S.top = NULL;
	S.stacksize = 0;
	free(S.base);
	return 1;
}
//清空 
Status ClearStack(SqStack &S) {
	S.top = S.base;
	return 1;
}
//判断是否为空 
bool StackEmpty(SqStack S) {
	if(S.top==S.base) return true;
	else return false;
}
Status StackLength(SqStack S) {
	return S.top-S.base;
}
//得到栈顶元素,不修改指针
bool GetTop(SqStack S,SElemType &e) { //用e去获得,函数返回bool类型去判断
	if(S.top==S.base) return false;//栈空
	else e=*--S.top;
	return true;
}
//入栈
Status Push(SqStack &S,SElemType e) {
	if(S.top-S.base==S.stacksize) return 0;//栈满
	*(S.top++)=e;//先入栈,栈顶指针再上移 
	return 1;
}
//出栈
Status Pop(SqStack &S,SElemType &e) {
	if(S.top==S.base) return 0;//栈空
	e=*--S.top;//先减减 指向栈顶元素,再给e
	return 1;
}
//遍历栈
Status StackTraverse(SqStack S) {
	if (S.base == NULL)
		return 0;
	if (S.top == S.base)
		printf("栈中没有元素……\n");
	SElemType *p;
	p = S.top;
	while (p > S.base) {
		p--;
		printf("%d ",*p);
	}
	return 1;
}
//***************************功能实现函数*******************************//
//菜单
void menu() {
	printf("********1.入栈      2.出栈*********\n");
	printf("********3.取栈顶    4.退出*********\n");
}
//入栈功能函数 调用Push函数
void PushToStack(SqStack &s) {
	int n;
	SElemType e;
	int flag;
	printf("请输入元素个数(>=1):");
	scanf("%d",&n);
	for(int i=0; i<n; i++) {
		printf("请输入第%d个元素的值:",i+1);
		scanf("%d",&e);
		flag=Push(s,e);
		if(flag) printf("%d已入栈\n",e);
		else {
			printf("栈已满!\n");
			break;
		}
	}
	int len=StackLength(s);
	printf("栈的长度为:%d\n",len);
}
//出栈功能函数 调用Pop函数
void PopFromStack(SqStack &s) {
	int n,flag;
	SElemType e;
	printf("请输入出栈元素个数(>=1):");
	scanf("%d",&n);
	for(int i=0; i<n; i++) {
		flag=Pop(s,e);
		if(flag) printf("%d已出栈\n",e);
		else {
			printf("栈已空!\n");
			break;
		}
	}
	int len=StackLength(s);
	printf("栈的长度为:%d\n",len);
}
//取栈顶功能函数 调用GetTop
void GetTopOfStack(SqStack &s) {
	SElemType e;
	bool flag;
	flag=GetTop(s,e);
	if(flag) printf("栈顶元素为:%d\n",e);
	else printf("栈已空!\n");
	int len=StackLength(s);
	printf("栈的长度为:%d\n",len);
}
//主函数
int main() {
	SqStack s;
	int choice;
	InitStack(s);
	while(1) {
		menu();
		printf("请输入菜单序号:\n");
		scanf("%d",&choice);
		if(choice==4) break;
		switch(choice) {
			case 1:
				PushToStack(s);
				break;
			case 2:
				PopFromStack(s);
				break;
			case 3:
				GetTopOfStack(s);
				break;
			default:
				printf("输入错误!");
		}
	}
	return 0;
}

结果截图:

在这里插入图片描述结果
结果

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值