为了训练阅读代码的能力,本篇文章的所有代码都不作详细注释。
一、顺序栈
实验要求:
构造一个顺序存储的栈,要求至少能够完成如下操作:将元素压入栈顶、将栈顶元素弹出、获取栈顶元素、清除栈。
参考代码及简要注释:
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 (