数据结构实验栈代码演示

这里使用C++环境:目的使用&引用符,除此以外是C语言代码

#define _CRT_SECURE_NO_WARNINGS 1
#define MAXSIZE 100//存储空间初始化分配量
#define STACKINCREMENT 10//存储空间分配增量
#define  ERROR 1
#define OVERFLOW 0
#define OK -2

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

typedef int SElemType;
typedef int Status;
typedef struct {
	
	SElemType* base;//在栈构造之前和销毁之后,值为NULL
	SElemType* top;//栈顶指针
	int stacksize;//当前已分配的存储空间,以元素为单位
}SqStack;

Status InitStack(SqStack& S) //建立空栈 S
{
	S.base = (SElemType*)malloc(MAXSIZE * sizeof(SElemType));
	if (!S.base) {
		exit(OVERFLOW);//存储分配失败
	}
	S.top = S.base;
	S.stacksize = MAXSIZE;
	return OK;
}

Status Push(SqStack& S, SElemType e) {
	//插入元素e为栈顶元素
	if (S.top - S.base >= S.stacksize){//栈满
		S.base = (SElemType*)realloc(S.base, S.stacksize + STACKINCREMENT
			* sizeof(SElemType));//追加存储空间
		if (!S.base) {
			exit(OVERFLOW);//存储分配失败
		}
		S.top = S.base + S.stacksize;
		S.stacksize += STACKINCREMENT;
	}
	*(S.top++) = e;
	return OK;
}

Status Pop(SqStack& S, SElemType& e){
	//删除S的栈顶元素,用e返回值,返回OK
	if (S.top == S.base) {
		return ERROR;
	}//空栈
	e = *(--S.top);
	return OK;
}
	
Status StackEmpty(SqStack &S){
	//判断是否为空栈
	if (S.top == S.base) {
		return OK;
	}
	else {
		return ERROR;
	}

}

Status PrintStack(SqStack S) {
	//打印栈中元素
	int a=StackEmpty(S);
	if (a > 0) {//不是空栈
		while (S.top!=S.base) {
			int e = *(--S.top);
			printf("%d\n", e);
		}
	}
	else if (a < 0) {
		printf("这是个空栈\n");
	}
	return OK;
}

void OperateMenu() {
	printf("0.:退出,1.:插入,2.:删除,3.:判断是否为空栈,4.:打印,5.:清空栈,6.:栈的长度\n");

}

void ClearStack(SqStack& S) {
	//清空栈
	while (S.top != S.base) {
		int e = 0;
		int a = Pop(S, e);
	}
	
}

int LengthStack(SqStack S) {
	//栈的长度
	int a = StackEmpty(S);
	int i = 0;
	if (a > 0) {//不是空栈
		while (S.top != S.base) {
			int e = *(--S.top);
			i++;
		}
	}
	else if (a < 0) {
		printf("这是个空栈\n");
	}
	printf("栈长度为:%d\n", i);
	return i;
}

int main() {
	SqStack S;
	S.base = S.top = NULL;
	int a = InitStack(S);
	OperateMenu();
	printf("请选择功能:\n");
	
	int e;
	int c;
	while (1) {
		scanf("%d", &a);
		switch (a){
		case 0:return 0;
		case 1:
			printf("请输入要插入栈顶的元素\n");
			scanf("%d", &e);
			Push(S, e);
			OperateMenu();
			break;
		case 2:
			Pop(S, e);
			OperateMenu();
			break;
		case 3:
			c=StackEmpty(S);
			if (c == OK) {
				printf("空栈\n");
			}
			else {
				printf("不是空栈\n");
			}
			OperateMenu();
			break;
		case 4:
			PrintStack(S);
			OperateMenu();
			break;
		case 5: ClearStack(S);
			OperateMenu();
			break;
		case 6:
			LengthStack(S);
			OperateMenu();
			break;
		

		default:
			printf("输入有误,请重新输入\n:");
			OperateMenu();
			break;
		}

	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值