题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可以把它替换成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 Stack ::Stack()//如果使用template 的话,函数的声明要变成这个样子 { /*析构函数需要包括 大小的声明,top值的设置,data的设置 */ size = MAX_SIZE; top = -1; //cout << "默认构造函数" << endl; data = new T[size]; } template Stack ::Stack(int s) { size = s; top = -1; //cout << "构造函数" << endl; data = new T[size]; } template Stack ::~Stack() { //析构函数中药将data删除 delete[] data; } template bool Stack ::isEmpty() { if (top == -1) return true; else return false; } template bool Stack ::isFull() { if (top + 1 == size)//数组的思想 return true; else return false; } template void Stack ::push(T n) { if (!isFull()) data[++top] = n;//数组元素加1 else throw "堆栈溢出,不能压入。"; } template T Stack ::pop() { if (!isEmpty()) return data[top--];//数组元素减1 else throw "堆栈为空,无法弹出。"; } template void Stack ::setNull() { top = -1;//将stack设置为空 } template void Stack ::reverseDisplay() { if(!isEmpty()) { for (int i=0; i<=top; i++) { cout << data[i]; } cout << endl; } else cout << "栈为空"<< endl;//相反显示 } template void Stack ::display()//正常显示,但是是和输入顺序相反 { if(!isEmpty()) { for (int i=top; i>=0; i--) { cout << data[i]<<" "; } cout << endl; } else cout << "栈为空"<< endl; } int main() { Stack m1; string h; cin>>h; int len=h.size();//获取字符串长度的函数 for(int i=0;i 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