题1:
完成Stack类的改造,将其设置为模板类。 使用这个模板Stack类创建两个堆栈对象。 在主程序中创建一个字符堆栈,一个int堆栈,分别压入一个字符串和5个整数,从顶端分别打印出两个堆栈的内容。
【测试数据】 输入: hello 1 2 3 4 5 输出: o l l e h 5 4 3 2 1 说明: 输出行的末尾可以有一个空格
- #include
- #include
- //stack的意思是堆,想象一堆堆在一起的文件,最上面的是top-1(就像数组一样的),最下面的是0(编号为0)
- using namespace std;
- const int MAX_SIZE=100;
- template <typename T>//typename可以把它替换成int之类的数据类型
- //那么之后这个T就表示int数据类型
- class Stack
- {
- private:
- T *data; //T类型数据的指针
- int size;
- int top;
- public:
- /*
- 这里需要以下的函数
- 构造,析构,把元素弄出去的函数(需要判断是否为空),
- 把元素放进来的函数(需要判断是否为满的函数)
- 显示的函数(正反显示),
- 如果可以的话还可以搞一个返回栈顶元素的函数
-
-
-
-
- */
- Stack();
- Stack(int s);
- ~Stack();
- void push(T ch);
- T pop(); //返回的元素是T类型的
- T getTopElement();
- bool isEmpty();
- bool isFull();
- void setNull();
- void reverseDisplay();
- void display();
- };
- template <typename T>
- Stack
::Stack()//如果使用template 的话,函数的声明要变成这个样子 -
- {
- /*析构函数需要包括
- 大小的声明,top值的设置,data的设置
-
-
-
- */
- size = MAX_SIZE;
- top = -1;
- //cout << "默认构造函数" << endl;
- data = new T[size];
- }
- template <typename T>
- Stack
::Stack(int s) - {
- size = s;
- top = -1;
- //cout << "构造函数" << endl;
- data = new T[size];
- }
- template <typename T>
- Stack
::~Stack() - {
- //析构函数中药将data删除
- delete[] data;
- }
- template <typename T>
- bool Stack
::isEmpty() - {
- if (top == -1)
- return true;
- else
- return false;
- }
- template <typename T>
- bool Stack
::isFull() - {
- if (top + 1 == size)//数组的思想
- return true;
- else
- return false;
- }
- template <typename T>
- void Stack
::push(T n) - {
- if (!isFull())
- data[++top] = n;//数组元素加1
- else
- throw "堆栈溢出,不能压入。";
- }
- template <typename T>
- T Stack
::pop() - {
- if (!isEmpty())
- return data[top--];//数组元素减1
- else
- throw "堆栈为空,无法弹出。";
- }
- template <typename T>
- void Stack
::setNull() - {
- top = -1;//将stack设置为空
- }
- template <typename T>
- void Stack
::reverseDisplay() - {
- if(!isEmpty())
- {
- for (int i=0; i<=top; i++)
- {
- cout << data[i];
- }
- cout << endl;
- }
- else
- cout << "栈为空"<< endl;//相反显示
-
- }
- template <typename T>
- void Stack
::display()//正常显示,但是是和输入顺序相反 - {
- if(!isEmpty())
- {
- for (int i=top; i>=0; i--)
- {
- cout << data[i]<<" ";
- }
- cout << endl;
- }
- else
- cout << "栈为空"<< endl;
- }
-
-
- int main()
- {
- Stack<char> m1;
- string h;
- cin>>h;
- int len=h.size();//获取字符串长度的函数
-
- for(int i=0;i
- {
- m1.push(h[i]);
- }
-
- Stack<int> m2(5);
- for(int i=0;i<5;i++)
- {
- int x;
- cin>>x;
- m2.push(x);
- }
-
- m1.display();
-
- m2.display();
- return 0;
-
-
- }
题2:
【题目要求】输入若干串字符,每次遇到换行符’\n’时,则输出本行当前处理结果。输入时以“#”字符作为结束符,当遇到这个符号后,意味着字符串输入结束。 在输入过程中如果输入“<”,则表示回退一格;在输入过程中如果包含了“@”,则表示回退到本行行首。
运行示例如下,其中加粗字体表示是运行中输入的内容,黑色字体表示系统的输出:
测试数据:
输入栈的大小:
80 输入待处理的字符串(输入<代表退一格,输入@代表清除到行首,输入#结束): ret
repeat
goo@goodluck
goodluck
re
excellent
abc<<<< 堆栈为空,无法弹出。//这里用异常处理codeblocks有输出,头歌没有输出。 栈为空 bye#
bye
- #include
- #include
- using namespace std;
- const int MAX_SIZE=100; //定义栈最大值常量
- class Stack
- {
- private:
- char *data; //属性:线性表
- int size; //栈的实际大小
- int top; //属性:栈顶
- public:
- Stack(); //构造函数
- Stack(int s); //有参构造函数
- ~Stack(); //析构函数
-
- //这里定义和声明getter和setter
-
- void push(char ch); //成员函数:入栈
- char pop(); //成员函数:出栈并返回栈顶元素
- char getTopElement(); //成员函数:获得栈顶元素(不出栈)
- bool isEmpty(); //成员函数:栈是否为空
- bool isFull(); //成员函数:栈是否满
- void setNull(); //设置栈为空
- void reverseDisplay();//以反序显示堆栈的内容
- void display(); //显示堆栈的内容
- };
-
- Stack::Stack()
- {
- size = MAX_SIZE;
- top = -1;
- //cout << "默认构造函数" << endl;
- //创建动态数组
-
- }
- Stack::Stack(int s)
- {
- size = s;
- top = -1;
- //cout << "构造函数" << endl;
- //创建动态数组
- if (size>0&&size<=100)
- data = new char[size];
- else if(size>100)
- {
- cout<<"堆栈大小超过最大值,创建失败。\n";
- data=NULL;
- size=0;
- }
- else
- {
- cout<<"堆栈大小小于0,创建失败。\n";
- data=NULL;
- size=0;
- }
- }
-
- Stack::~Stack()
- {
- //cout << "析构函数" << endl;
- //释放动态数组
-
-
- }
-
- bool Stack::isEmpty()
- {
- if (top == -1)
- return true;
- else
- return false;
- }
- bool Stack::isFull()
- {
- if (top + 1 == size)
- return true;
- else
- return false;
- }
-
- void Stack::push(char n)
- {
- if (!isFull())
- data[++top] = n;
-
- }
-
- char Stack::pop()
- {
- if (!isEmpty())
- return data[top--];
- //我把throw函数删除了
- }
-
- void Stack::setNull()
- {
- top = -1;
- //哦哦,原理如此,当我们将堆栈清空的时候可以讲一个个的数据弹出,或者是将top变成-1
- }
-
- void Stack::reverseDisplay()
- {
- if(!isEmpty())
- {
- for (int i=0; i<=top; i++)
- {
- cout << data[i];
- }
- cout << endl;
- }
- else
- cout << "栈为空"<< endl;
-
- }
-
- void Stack::display()
- {
- if(!isEmpty())
- {
- for (int i=top; i>=0; i--)
- {
- cout << data[i];
- }
- cout << endl;
- }
- else
- cout << "栈为空"<< endl;
- }
-
- int main()
- {
- int size;
- cout<<"输入栈的大小:输入待处理的字符串(输入<代表退一格,输入@代表清除到行首,输入#结束):"<
- //'<'表示出去一个元素 ,@表示设置为空(因为换行就会输出本行),‘\n'表示显示和设置为空,’#‘表示显示和设置为空还有结束
- //’#'结束,但是最后一行没有输出
- cin>>size;
- cin.ignore();//这个就是吸收换行符
- Stack stack(size);
- char ch;
- while((ch=cin.get())!='#')
- {
- if(ch=='<')
- {
- stack.pop();
- }
- else if(ch=='@')
- {
- stack.setNull();
- }
- else if(ch=='\n')
- {
-
- stack.reverseDisplay();
- stack.setNull();
- }
- else
- {
- stack.push(ch);
- }
- }
-
- if(ch=='#')
- {
- stack.reverseDisplay();
- stack.setNull();
- }
-
- //几个和字符相关的函数 cin.get()读取单个字符,cin.ignore()表示吸收换行符
-
- return 0;
-
-
-
-
-
- }
-
相关阅读:
Vue rules校验规则详解
猿创征文 |【数据结构】3个例题带你搞定图的遍历:深度优先搜索
Unity AI Sentis 基础教程
【.NET全栈】ASP.NET开发Web应用——站点导航技术
三步减少打包机故障
Windows Nginx 服务器部署(保姆级)
数据库管理-第四十二期 复盘一下(20221104)
自动驾驶名词学习
(十四)笔记.net学习之RabbitMQ工作模式
YOLO系列目标检测算法-Scaled-YOLOv4
-
原文地址:https://blog.csdn.net/2301_80062106/article/details/136286677