题1:
完成Stack类的改造,将其设置为模板类。 使用这个模板Stack类创建两个堆栈对象。 在主程序中创建一个字符堆栈,一个int堆栈,分别压入一个字符串和5个整数,从顶端分别打印出两个堆栈的内容。
【测试数据】 输入: hello 1 2 3 4 5 输出: o l l e h 5 4 3 2 1 说明: 输出行的末尾可以有一个空格
#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;elsereturn false;
}
template <typename T>
bool Stack<T>::isFull()
{if (top + 1 == size)//数组的思想return true;elsereturn false;
}
template <typename T>
void Stack<T>::push(T n)
{if (!isFull())data[++top] = n;//数组元素加1elsethrow "堆栈溢出,不能压入。";
}
template <typename T>
T Stack<T>::pop()
{if (!isEmpty())return data[top--];//数组元素减1elsethrow "堆栈为空,无法弹出。";
}
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;}elsecout << "栈为空"<< endl;//相反显示}
template <typename T>
void Stack<T>::display()//正常显示,但是是和输入顺序相反
{if(!isEmpty()){for (int i=top; i>=0; i--){cout << data[i]<<" ";}cout << endl;}elsecout << "栈为空"<< 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
#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和settervoid 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;elsereturn false;
}
bool Stack::isFull()
{if (top + 1 == size)return true;elsereturn 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;}elsecout << "栈为空"<< endl;}void Stack::display()
{if(!isEmpty()){for (int i=top; i>=0; i--){cout << data[i];}cout << endl;}elsecout << "栈为空"<< 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;}