源代码:
// 3_a1.cpp -- 顺序栈结构的定义
/*
* -> 程序要求:
* 1. 完成对顺序栈结构的定义,以及对顺序栈的各种基本运算的实现(每种基本运算用一个函数来实现)。
* 2. 基本运算包括:初始化Init_sqstack运算、判栈空Empty_sqstack运算、入栈Push_sqstack运算、出栈Pop_sqstack运算、取栈顶元素Gettop_sqstack运算。
* 3. 并且在main函数中分别调用以上各种基本运算的函数来使用,以证明其功能已实现。
* 4. 此题的源程序保存为 3_a1.cpp
*/
/*
* -> 程序分析:
* 1. 顺序栈比顺序表还要容易写,思想方面,差不多是顺序表的一个特例。
* 2. 顺序栈的主要数据成员有:决定大小的元素(最大值,使用值),存放的数据。
* 3. 顺序栈的函数成员正如题目所列出来的那几种,从栈的功能来想的话,就是 [入,出,取],其它的有判空,初始,销毁,复制等还有一些按程序需求的扩展要求。
*/
#include <iostream>
using std::cout;
using std::endl;
template <typename elem>
class sqstack
{
private:
enum size{defaultmaxsize = 6}; // 默认栈大小
int maxsize; // 该栈顶的最大size
int top; // 当前的栈顶设为top - 1
elem * arr; // 整个栈表的指针
public:
// 初始化及销毁顺序栈表
sqstack (signed ms = defaultmaxsize): maxsize(ms), arr(new elem[maxsize]), top(0){}
~sqstack(){ delete [] arr; maxsize = 0; top = 0;}
//基本功能的实现
bool isempty() {return top == 0;} // 判断表是否为空
bool isfull() {return top == maxsize;} // 判断表是否满
int sqstacksize() {return top;} // 返回栈表的大小
// [取,出,入]
void push(const elem &); // 入
void pop(); // 出
elem Gettophelp(); // 取栈顶元素
void Gettop();
};
template<typename elem>
void sqstack<elem>::push(const elem & pelem) // 入栈
{
if (isfull() == true)
{
cout << "\n放入元素失败,表满。\n";
return;
}
arr[top++] = pelem;
cout << "\n成功放入元素" << pelem << "\n";
return;
}
template <typename elem>
void sqstack<elem>::pop() // 出栈
{
if (isempty() == true)
{
cout << "出栈失败,表空。";
return;
}
--top;
return;
}
template <typename elem>
elem sqstack<elem>::Gettophelp() // 取栈顶元素
{
return arr[top - 1];
}
template <typename elem>
void sqstack<elem>::Gettop()
{
if(isempty())
{
cout << "元素获取失败,栈空。";
return;
}
else
cout << "栈顶元素为" << Gettophelp();
return;
}
int main()
{
cout << ".................................栈功能测试开始................................\n";
sqstack<int> test;
// 入
cout << "\n-> 入栈测试:( 当前栈顶位置为" << test.sqstacksize() << " )\n";
cout << "放入元素 1, 2, 3, 4, 5, 6.\n";
for (int i = 1; i != 10; ++i)
{
cout << "i = " << i << ": ";
test.push(i);
}
// 取
cout << "\n-> 取栈顶元素测试:\n";
test.Gettop();
// 出
cout << "\n\n-> 出栈测试:( 当前栈顶位置为" << test.sqstacksize() << " )\n";
for (int i = 1; i != 10; ++i)
{
cout << "第 " << i << "次出栈: ";
test.pop();
cout << endl;
}
system("pause");
return 0;
}
运行结果:
.................................栈功能测试开始................................
-> 入栈测试:( 当前栈顶位置为0 )
放入元素 1, 2, 3, 4, 5, 6.
i = 1:
成功放入元素1
i = 2:
成功放入元素2
i = 3:
成功放入元素3
i = 4:
成功放入元素4
i = 5:
成功放入元素5
i = 6:
成功放入元素6
i = 7:
放入元素失败,表满。
i = 8:
放入元素失败,表满。
i = 9:
放入元素失败,表满。
-> 取栈顶元素测试:
栈顶元素为6
-> 出栈测试:( 当前栈顶位置为6 )
第 1次出栈:
第 2次出栈:
第 3次出栈:
第 4次出栈:
第 5次出栈:
第 6次出栈:
第 7次出栈: 出栈失败,表空。
第 8次出栈: 出栈失败,表空。
第 9次出栈: 出栈失败,表空。
请按任意键继续. . .