【数据结构实验】顺序栈、顺序(线性)队列、循环队列DEMO

本文提供顺序栈、顺序队列和循环队列的实现,包括压入、弹出、获取栈顶/队首元素等操作。文章通过无注释代码展示如何处理上溢、下溢以及循环队列中的假上溢问题,通过随机数操作进行演示。
摘要由CSDN通过智能技术生成

为了训练阅读代码的能力,本篇文章的所有代码都不作详细注释。

一、顺序栈

实验要求:
构造一个顺序存储的栈,要求至少能够完成如下操作:将元素压入栈顶、将栈顶元素弹出、获取栈顶元素、清除栈。
参考代码及简要注释:
1、push 和 pop 动作都会返回一个 bool 变量,1 代表操作成功,0 代表操作失败。
2、本表通过构造一系列随机数来完成对顺序栈的操作的演示。
3、当栈满时再做进栈运算必定产生空间溢出,简称“上溢”;
当栈空时再做退栈运算也将产生溢出,简称“下溢”。
上溢是一种出错状态,应该设法避免之。
下溢是正常现象,因为栈在程序中使用时,其初态或终态大多数时候都是空栈,所以下溢常常用来作为程序控制转移的条件。

#include<cstdio>
#include<random>
#include<ctime>
#pragma warning(disable:4996)
typedef unsigned long long ull; typedef unsigned uint;
const ull lmax = 64;
template<typename t> struct SqStack {
    t* bottom = nullptr, * top; ull size; };
template<typename t> inline void InitSqStack(SqStack<t> &s){
   
	s.bottom = (t*)malloc(sizeof(t) * lmax), s.top = s.bottom - 1, s.size = 0;
}
template<typename t> inline void ClearSqStack(SqStack<t> &s){
   
	if (s.bottom != nullptr) {
    free(s.bottom), InitSqStack(s); }
}
template<typename t> inline bool PushIntoSqStack(SqStack<t> &s, const t& value){
   
	if (s.size == lmax)return false;
	++s.size, ++s.top, * s.top = value; return true;
}
template<typename t> inline bool PopFromSqStack(SqStack<t> &s){
   
	if (s.size == 0)return false;
	--s.size, --s.top; return true;
}
template<typename t> inline t TopOfSqStack(const SqStack<t> &s){
   
	return *s.top;
}
int main(){
   
	SqStack<uint> s; std::uniform_int_distribution<uint> u(0, 9999), v(1, 128), w(1, 64); std::default_random_engine d; d.seed(clock()); uint n, e;
	InitSqStack(s);
	for (;;) {
   
		n = v(d); for (uint i = 0; i < n; ++i) {
   
			e = u(d);
			switch (
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值