题1:
完成Stack类的改造,将其设置为模板类。 使用这个模板Stack类创建两个堆栈对象。 在主程序中创建一个字符堆栈,一个int堆栈,分别压入一个字符串和5个整数,从顶端分别打印出两个堆栈的内容。
【测试数据】 输入: hello 1 2 3 4 5 输出: o l l e h 5 4 3 2 1 说明: 输出行的末尾可以有一个空格
cpp
#include <iostream>
#include<cstring>
//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<T>::Stack()//如果使用template <typename T>的话,函数的声明要变成这个样子
{
/*析构函数需要包括
大小的声明,top值的设置,data的设置
*/
size = MAX_SIZE;
top = -1;
//cout << "默认构造函数" << endl;
data = new T[size];
}
template <typename T>
Stack<T>::Stack(int s)
{
size = s;
top = -1;
//cout << "构造函数" << endl;
data = new T[size];
}
template <typename T>
Stack<T>::~Stack()
{
//析构函数中药将data删除
delete[] data;
}
template <typename T>
bool Stack<T>::isEmpty()
{
if (top == -1)
return true;
else
return false;
}
template <typename T>
bool Stack<T>::isFull()
{
if (top + 1 == size)//数组的思想
return true;
else
return false;
}
template <typename T>
void Stack<T>::push(T n)
{
if (!isFull())
data[++top] = n;//数组元素加1
else
throw "堆栈溢出,不能压入。";
}
template <typename T>
T Stack<T>::pop()
{
if (!isEmpty())
return data[top--];//数组元素减1
else
throw "堆栈为空,无法弹出。";
}
template <typename T>
void Stack<T>::setNull()
{
top = -1;//将stack设置为空
}
template <typename T>
void Stack<T>::reverseDisplay()
{
if(!isEmpty())
{
for (int i=0; i<=top; i++)
{
cout << data[i];
}
cout << endl;
}
else
cout << "栈为空"<< endl;//相反显示
}
template <typename T>
void Stack<T>::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<len;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<peatabc<<<
repeat
goo@goodluck
goodluck
re<c@good@excellent
excellent
abc<<<< 堆栈为空,无法弹出。//这里用异常处理codeblocks有输出,头歌没有输出。 栈为空 bye#
bye
cpp
#include <iostream>
#include<string.h>
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<<"输入栈的大小:输入待处理的字符串(输入<代表退一格,输入@代表清除到行首,输入#结束):"<<endl;
//'<'表示出去一个元素 ,@表示设置为空(因为换行就会输出本行),'\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;
}