姓名:Far_Rainbow
学号: 202505000X
专业: 软件工程
年级:2020级
实验名称:实验4 顺序栈的基本操作及应用
实验内容:
(1)实验目的
通过该实验,让学生掌握栈的相关基本概念,认识栈是插入和删除集中在一端进行的线性结构,掌握栈的“先入后出”操作特点。栈在进行各类操作时,栈底指针固定不动,掌握栈空、栈满的判断条件。
(2)实验内容
用顺序存储结构,实现教材定义的栈的基本操作,提供数制转换功能,将输入的十进制整数转换成二进制、八进制或十六进制。
(3)参考界面
菜单中包括以下功能:
1.初始化栈,2.销毁栈,3.清空栈,4.栈判空,5.求栈长度,6.获取栈顶元素,7.插入一个 元素,8.删除一个元素,9输出所有元素,10进制转换。
要求:自定义的函数中不允许出现提示语和输出语句。
(4)验收/测试用例
通过菜单调用各个操作,测试点:
- 没有初始化前进行其他操作,程序是否能控制住;
- 初始化一个栈; 判栈空,屏幕显示栈为空; 3个数入栈, 2、4、6; 栈长度,屏幕输出3;
- 取栈顶元素,再判栈空,然后再判栈长度。让学生知道取栈顶元素不改变栈中的内容,栈顶指针不发生改变;
- 出栈,再判栈长度和输出栈中内容;(多次出栈,直到栈为空;再出栈,是否提示栈为空) 销毁栈,再做其他操作,判断程序是否能控制;
- 数制转换,(允许用户输入想把十进制转换成几进制),然后灵活的转换成对应的进制。
实验类型:验证性
实验的重难点:入栈和出栈、进制转换(十六进制)
实验环境:TDM-GCC 4.9.2 64-bit
实验步骤及完成任务情况:
一、设计思想
- 采用模板实现泛型编程,可创建任意数据类型的栈;
- 以顺序表为原型实现顺序栈,设立栈顶指针始终指向最后一个元素的下一个地址;
- 实现expend()函数,在栈即将溢出时为栈分配新的内存空间;
- 使用栈实现进制转换功能
二、主要源代码
#include <iostream>#include <string>#include <map>#define STACKSIZE 1000#define STACKINCREMENT 100using std::cin;using std::cout;using std::endl;template <typename T> class Stack {private:T* base;T* top;int _length;int _capacity;void expand();public:void init();void destroy();void clear();Stack() : base(NULL), top(NULL) { }~Stack() {destroy(); }bool isempty() const {return _length > 0 ? 0 : 1; }bool exist() const {return _capacity > 0 ? 1 : 0; }int getlength() const {return _length; }T& getop() const {return * (top-1); }void push(T const& e);T pop() {-- _length; return * -- top; }void traverse() const{for(T* ptr = top - 1; ptr >= base; -- ptr) cout<<*ptr<<' '; }};template <typename T> void Stack<T>::init(){base = new T[STACKSIZE];top = base;_length = 0;_capacity = STACKSIZE;}template <typename T> void Stack<T>::destroy(){delete[] base;base = top = NULL;_length = 0;_capacity = 0;}template <typename T> void Stack<T>::clear(){top = base;_length = 0;}template <typename T> void Stack<T>::expand(){T* newbase = new T[_capacity+STACKINCREMENT];for(int i = 0; i < _length; ++ i) newbase[i] = base[i];delete[] base;base = newbase;}template <typename T> void Stack<T>::push(T const& e){if (top - base > _capacity) expand();* top ++ = e;++ _length;}void conversion(int a, long long int num){Stack<int> tran;tran.init();int tmp;if (num == 0){cout<<num;return;}while(num){tran.push(num % a);num = num / a;}while(!tran.isempty()){tmp = tran.pop();switch(tmp){case 10: cout<<'A';break;case 11: cout<<'B';break;case 12: cout<<'C';break;case 13: cout<<'D';break;case 14: cout<<'E';break;case 15: cout<<'F';break;default: cout<<tmp;}}}void conversionmenu(){std::map<int, std::string> mp;std::map<int, int> np;mp[1] = "二进制"; np[1] = 2;mp[2] = "八进制"; np[2] = 8;mp[3] = "十六进制"; np[3] = 16;int n;long long int num;char c = 'y';cout<<"欢迎使用进制转换功能!\n";cout<<"1 二进制 2 八进制 3 十六进制\n\n";while(true){cout<<"\n请选择你想要转换的进制:";cin>>n;if (n < 1 || n > 4){cout<<"请正确输入您的选择!\n";continue;}cout<<"您选择的是十进制转换成"<<mp[n]<<"[y/n]:";cin>>c;if (c == 'y') {cout<<"请输入您想要转换的数:";cin>>num;cout<<"转换成"<<mp[n]<<"的数是:";conversion(np[n], num);return;}else continue;}}int main(){cout<<"\n 顺序栈的基本操作\n\n";cout<<"1---初始化栈\n";cout<<"2---销毁栈\n";cout<<"3---清空栈\n";cout<<"4---栈判空\n";cout<<"5---求栈长度\n";cout<<"6---获取栈顶元素\n";cout<<"7---插入一个元素\n";cout<<"8---删除一个元素\n";cout<<"9---输出所有元素\n";cout<<"10--进制转换\n";cout<<"\n\t退出,输入一个负数!\n\n";Stack<int> s;int e;while(true){int myOption;cout<<"\n请输入操作序号:";cin>>myOption;switch(myOption){case 1:{if(s.exist()){cout<<"初始化失败,栈已存在\n";break;}s.init();cout<<"初始化成功!\n";break;}case 2:{if (!s.exist()){cout<<"销毁失败,栈不存在\n";break;}s.destroy();cout<<"销毁成功!\n";break;}case 3:{if (!s.exist()){cout<<"清空失败,栈不存在\n";break;}if (s.isempty()) ;else s.clear();cout<<"清空成功!\n";break;}case 4:{if (!s.exist()){cout<<"判空失败,栈不存在\n";break;}if (s.isempty()) cout<<"栈为空!\n";else cout<<"栈非空!\n";break;}case 5:{if (!s.exist()){cout<<"请先创建栈!\n";break;}cout<<"栈的长度是"<<s.getlength()<<endl;break;}case 6:{if (!s.exist()){cout<<"获取失败,栈不存在\n";break;}if (s.isempty()){cout<<"栈为空,无栈顶元素!\n";break;}cout<<"栈顶元素是"<<s.getop()<<endl;break;}case 7:{if (!s.exist()){cout<<"插入失败,栈不存在!\n";break;}cout<<"请输入待插入元素e\n"<<" e为:";cin>>e;s.push(e);break;}case 8:{if (!s.exist()){cout<<"删除失败,栈不存在!\n";break;}if (s.isempty()){cout<<"栈为空,删除失败!\n";break;}else {e = s.pop();cout<<"被删除的元素是:"<<e<<endl;}break;}case 9:{if (!s.exist()){cout<<"遍历并输出失败,栈不存在!\n";break;}if (s.isempty()){cout<<"栈为空!\n";break;}cout<<"栈的所有元素是:";s.traverse();cout<<endl;break;}case 10:{conversionmenu();cout<<endl;break;}}if(myOption > 10 || myOption == 0) cout<<"\n请输入小于10的正整数\n\n";if(myOption < 0){cout<<"\n退出程序!\n";break;}}return 0;}
实验结果:




