• stack类别


    题1:

    完成Stack类的改造,将其设置为模板类。 使用这个模板Stack类创建两个堆栈对象。 在主程序中创建一个字符堆栈,一个int堆栈,分别压入一个字符串和5个整数,从顶端分别打印出两个堆栈的内容。

    【测试数据】 输入: hello 1 2 3 4 5 输出: o l l e h 5 4 3 2 1 说明: 输出行的末尾可以有一个空格

    1. #include
    2. #include
    3. //stack的意思是堆,想象一堆堆在一起的文件,最上面的是top-1(就像数组一样的),最下面的是0(编号为0)
    4. using namespace std;
    5. const int MAX_SIZE=100;
    6. template <typename T>//typename可以把它替换成int之类的数据类型
    7. //那么之后这个T就表示int数据类型
    8. class Stack
    9. {
    10. private:
    11. T *data; //T类型数据的指针
    12. int size;
    13. int top;
    14. public:
    15. /*
    16. 这里需要以下的函数
    17. 构造,析构,把元素弄出去的函数(需要判断是否为空),
    18. 把元素放进来的函数(需要判断是否为满的函数)
    19. 显示的函数(正反显示),
    20. 如果可以的话还可以搞一个返回栈顶元素的函数
    21. */
    22. Stack();
    23. Stack(int s);
    24. ~Stack();
    25. void push(T ch);
    26. T pop(); //返回的元素是T类型的
    27. T getTopElement();
    28. bool isEmpty();
    29. bool isFull();
    30. void setNull();
    31. void reverseDisplay();
    32. void display();
    33. };
    34. template <typename T>
    35. Stack::Stack()//如果使用template 的话,函数的声明要变成这个样子
    36. {
    37. /*析构函数需要包括
    38. 大小的声明,top值的设置,data的设置
    39. */
    40. size = MAX_SIZE;
    41. top = -1;
    42. //cout << "默认构造函数" << endl;
    43. data = new T[size];
    44. }
    45. template <typename T>
    46. Stack::Stack(int s)
    47. {
    48. size = s;
    49. top = -1;
    50. //cout << "构造函数" << endl;
    51. data = new T[size];
    52. }
    53. template <typename T>
    54. Stack::~Stack()
    55. {
    56. //析构函数中药将data删除
    57. delete[] data;
    58. }
    59. template <typename T>
    60. bool Stack::isEmpty()
    61. {
    62. if (top == -1)
    63. return true;
    64. else
    65. return false;
    66. }
    67. template <typename T>
    68. bool Stack::isFull()
    69. {
    70. if (top + 1 == size)//数组的思想
    71. return true;
    72. else
    73. return false;
    74. }
    75. template <typename T>
    76. void Stack::push(T n)
    77. {
    78. if (!isFull())
    79. data[++top] = n;//数组元素加1
    80. else
    81. throw "堆栈溢出,不能压入。";
    82. }
    83. template <typename T>
    84. T Stack::pop()
    85. {
    86. if (!isEmpty())
    87. return data[top--];//数组元素减1
    88. else
    89. throw "堆栈为空,无法弹出。";
    90. }
    91. template <typename T>
    92. void Stack::setNull()
    93. {
    94. top = -1;//将stack设置为空
    95. }
    96. template <typename T>
    97. void Stack::reverseDisplay()
    98. {
    99. if(!isEmpty())
    100. {
    101. for (int i=0; i<=top; i++)
    102. {
    103. cout << data[i];
    104. }
    105. cout << endl;
    106. }
    107. else
    108. cout << "栈为空"<< endl;//相反显示
    109. }
    110. template <typename T>
    111. void Stack::display()//正常显示,但是是和输入顺序相反
    112. {
    113. if(!isEmpty())
    114. {
    115. for (int i=top; i>=0; i--)
    116. {
    117. cout << data[i]<<" ";
    118. }
    119. cout << endl;
    120. }
    121. else
    122. cout << "栈为空"<< endl;
    123. }
    124. int main()
    125. {
    126. Stack<char> m1;
    127. string h;
    128. cin>>h;
    129. int len=h.size();//获取字符串长度的函数
    130. for(int i=0;i
    131. {
    132. m1.push(h[i]);
    133. }
    134. Stack<int> m2(5);
    135. for(int i=0;i<5;i++)
    136. {
    137. int x;
    138. cin>>x;
    139. m2.push(x);
    140. }
    141. m1.display();
    142. m2.display();
    143. return 0;
    144. }

    题2:

    【题目要求】输入若干串字符,每次遇到换行符’\n’时,则输出本行当前处理结果。输入时以“#”字符作为结束符,当遇到这个符号后,意味着字符串输入结束。 在输入过程中如果输入“<”,则表示回退一格;在输入过程中如果包含了“@”,则表示回退到本行行首。

    运行示例如下,其中加粗字体表示是运行中输入的内容,黑色字体表示系统的输出:

    测试数据:

    输入栈的大小:

    80 输入待处理的字符串(输入<代表退一格,输入@代表清除到行首,输入#结束): ret

    repeat

    goo@goodluck

    goodluck

    re

    excellent

    abc<<<< 堆栈为空,无法弹出。//这里用异常处理codeblocks有输出,头歌没有输出。 栈为空 bye#

    bye

    1. #include
    2. #include
    3. using namespace std;
    4. const int MAX_SIZE=100; //定义栈最大值常量
    5. class Stack
    6. {
    7. private:
    8. char *data; //属性:线性表
    9. int size; //栈的实际大小
    10. int top; //属性:栈顶
    11. public:
    12. Stack(); //构造函数
    13. Stack(int s); //有参构造函数
    14. ~Stack(); //析构函数
    15. //这里定义和声明getter和setter
    16. void push(char ch); //成员函数:入栈
    17. char pop(); //成员函数:出栈并返回栈顶元素
    18. char getTopElement(); //成员函数:获得栈顶元素(不出栈)
    19. bool isEmpty(); //成员函数:栈是否为空
    20. bool isFull(); //成员函数:栈是否满
    21. void setNull(); //设置栈为空
    22. void reverseDisplay();//以反序显示堆栈的内容
    23. void display(); //显示堆栈的内容
    24. };
    25. Stack::Stack()
    26. {
    27. size = MAX_SIZE;
    28. top = -1;
    29. //cout << "默认构造函数" << endl;
    30. //创建动态数组
    31. }
    32. Stack::Stack(int s)
    33. {
    34. size = s;
    35. top = -1;
    36. //cout << "构造函数" << endl;
    37. //创建动态数组
    38. if (size>0&&size<=100)
    39. data = new char[size];
    40. else if(size>100)
    41. {
    42. cout<<"堆栈大小超过最大值,创建失败。\n";
    43. data=NULL;
    44. size=0;
    45. }
    46. else
    47. {
    48. cout<<"堆栈大小小于0,创建失败。\n";
    49. data=NULL;
    50. size=0;
    51. }
    52. }
    53. Stack::~Stack()
    54. {
    55. //cout << "析构函数" << endl;
    56. //释放动态数组
    57. }
    58. bool Stack::isEmpty()
    59. {
    60. if (top == -1)
    61. return true;
    62. else
    63. return false;
    64. }
    65. bool Stack::isFull()
    66. {
    67. if (top + 1 == size)
    68. return true;
    69. else
    70. return false;
    71. }
    72. void Stack::push(char n)
    73. {
    74. if (!isFull())
    75. data[++top] = n;
    76. }
    77. char Stack::pop()
    78. {
    79. if (!isEmpty())
    80. return data[top--];
    81. //我把throw函数删除了
    82. }
    83. void Stack::setNull()
    84. {
    85. top = -1;
    86. //哦哦,原理如此,当我们将堆栈清空的时候可以讲一个个的数据弹出,或者是将top变成-1
    87. }
    88. void Stack::reverseDisplay()
    89. {
    90. if(!isEmpty())
    91. {
    92. for (int i=0; i<=top; i++)
    93. {
    94. cout << data[i];
    95. }
    96. cout << endl;
    97. }
    98. else
    99. cout << "栈为空"<< endl;
    100. }
    101. void Stack::display()
    102. {
    103. if(!isEmpty())
    104. {
    105. for (int i=top; i>=0; i--)
    106. {
    107. cout << data[i];
    108. }
    109. cout << endl;
    110. }
    111. else
    112. cout << "栈为空"<< endl;
    113. }
    114. int main()
    115. {
    116. int size;
    117. cout<<"输入栈的大小:输入待处理的字符串(输入<代表退一格,输入@代表清除到行首,输入#结束):"<
    118. //'<'表示出去一个元素 ,@表示设置为空(因为换行就会输出本行),‘\n'表示显示和设置为空,’#‘表示显示和设置为空还有结束
    119. //’#'结束,但是最后一行没有输出
    120. cin>>size;
    121. cin.ignore();//这个就是吸收换行符
    122. Stack stack(size);
    123. char ch;
    124. while((ch=cin.get())!='#')
    125. {
    126. if(ch=='<')
    127. {
    128. stack.pop();
    129. }
    130. else if(ch=='@')
    131. {
    132. stack.setNull();
    133. }
    134. else if(ch=='\n')
    135. {
    136. stack.reverseDisplay();
    137. stack.setNull();
    138. }
    139. else
    140. {
    141. stack.push(ch);
    142. }
    143. }
    144. if(ch=='#')
    145. {
    146. stack.reverseDisplay();
    147. stack.setNull();
    148. }
    149. //几个和字符相关的函数 cin.get()读取单个字符,cin.ignore()表示吸收换行符
    150. return 0;
    151. }

  • 相关阅读:
    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