stack类别

题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;

   



}
相关推荐
浮生如梦_1 小时前
Halcon基于laws纹理特征的SVM分类
图像处理·人工智能·算法·支持向量机·计算机视觉·分类·视觉检测
励志成为嵌入式工程师3 小时前
c语言简单编程练习9
c语言·开发语言·算法·vim
捕鲸叉3 小时前
创建线程时传递参数给线程
开发语言·c++·算法
A charmer3 小时前
【C++】vector 类深度解析:探索动态数组的奥秘
开发语言·c++·算法
Peter_chq3 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
wheeldown4 小时前
【数据结构】选择排序
数据结构·算法·排序算法
青花瓷5 小时前
C++__XCode工程中Debug版本库向Release版本库的切换
c++·xcode
观音山保我别报错5 小时前
C语言扫雷小游戏
c语言·开发语言·算法
幺零九零零6 小时前
【C++】socket套接字编程
linux·服务器·网络·c++
TangKenny6 小时前
计算网络信号
java·算法·华为