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;

   



}
相关推荐
EterNity_TiMe_几秒前
【论文复现】(CLIP)文本也能和图像配对
python·学习·算法·性能优化·数据分析·clip
长弓聊编程2 分钟前
Linux系统使用valgrind分析C++程序内存资源使用情况
linux·c++
cherub.9 分钟前
深入解析信号量:定义与环形队列生产消费模型剖析
linux·c++
机器学习之心12 分钟前
一区北方苍鹰算法优化+创新改进Transformer!NGO-Transformer-LSTM多变量回归预测
算法·lstm·transformer·北方苍鹰算法优化·多变量回归预测·ngo-transformer
yyt_cdeyyds22 分钟前
FIFO和LRU算法实现操作系统中主存管理
算法
暮色_年华24 分钟前
Modern Effective C++item 9:优先考虑别名声明而非typedef
c++
重生之我是数学王子32 分钟前
QT基础 编码问题 定时器 事件 绘图事件 keyPressEvent QT5.12.3环境 C++实现
开发语言·c++·qt
daiyang123...1 小时前
测试岗位应该学什么
数据结构
alphaTao1 小时前
LeetCode 每日一题 2024/11/18-2024/11/24
算法·leetcode
我们的五年1 小时前
【Linux课程学习】:进程程序替换,execl,execv,execlp,execvp,execve,execle,execvpe函数
linux·c++·学习