学不会绝不改名 发表于 2021-12-28 11:29:28

编写一个类实现如下功能

1.        编写程序,其中定义一个int顺序栈类CSeqStack(最多可存放100个元素),其中包含如下公有成员:
a)无参构造函数,初始化一个空栈;
b)拷贝构造函数,初始化一个传入栈对象的拷贝;
c)void CSeqStack::push(int x),压栈操作;
d)int CSeqStack::pop(),弹栈操作;
e)int CSeqStack::isEmpty(),判栈空操作,栈中元素为0返回true,否则返回false;
f)int CSeqStack::isFull(),判栈空操作,栈中元素≥100返回true,否则返回false;
g)析构函数;
使用该类实现如下功能:从控制台输入一组正整数(数量不超过100,输入0表示结束),将输入的这些正整数按输入顺序逆序输出,且每行输出5个数(用,分隔)。

傻眼貓咪 发表于 2021-12-28 19:03:40

本帖最后由 傻眼貓咪 于 2021-12-28 19:09 编辑

我的代码有三点必须注意:
1.)采用头文件和源文件编写,在运行之前,请自行确保路径与设定无误(不要问我为什么系统显示找不到之类的问题)。
2.)我用头文件 <memory> 里面有个成员 make_unique 只能是 C++14 或以上版本才能正常运行,如果你的编译器是老版本,不能运行(不要问我为什么,问 C++ 官方)。
3.)我不晓得为什么楼主明明才做填空白题,突然跳跃这么远,希望楼主已经将基础学稳了,不然看见我的代码什么都问,我会晕{:10_247:},基本上我都已经注解了。

CSeqStack.h
/* 头文件 */
#include <memory>
using namespace std;

class CSeqStack
{
        /* 私有成员 */
    unique_ptr<int[]>stackArray; // C++11
    int capacity;
    int top;
   
        public:
               
          CSeqStack(int capacity); // 构造函数
          ~CSeqStack(); // 析构函数
          
          /* 公共成员 */
          void push(int value);
          void pop (int &value);
          bool isEmpty() const;
          bool isFull() const;
          
          /* 堆栈异常 */
          class Overflow {};
          class Underflow {};
};CSeqStack.cpp/* 源文件 */
#include "CSeqStack.h"

CSeqStack::CSeqStack(int capacity){
    stackArray = make_unique<int[]>(capacity); // C++14
    this->capacity = capacity;
    top = 0;
}

/* (g)析构函数 */
CSeqStack::~CSeqStack(){}

void CSeqStack::push(int value){
    if (top == capacity)
      throw CSeqStack::Overflow();
    stackArray = value;
    top++;
}

bool CSeqStack::isEmpty() const{ return top == 0; }

bool CSeqStack::isFull() const{ return top >= capacity; }

void CSeqStack::pop(int &value){
    if (isEmpty()) throw CSeqStack::Underflow();
    top--;
    value = stackArray;
}main.cpp/* 这是主文件 */
#include "CSeqStack.h"
#include <iostream>

using namespace std;

int main()
{
    /* (a)无参构造函数,初始化一个空栈,最多可存放100个元素*/
    CSeqStack stack(100);
       
    /* (b)拷贝构造函数,初始化一个传入栈对象的拷贝 */
    CSeqStack *p = &stack;
       
    int value, num;
   
    /* (c)压栈操作 */
    cout << "压栈操作...\n";
    while(scanf("%d", &num)){
      if(!num) break;
                p->push(num);
      cout << num << " ";
        }
       
    /* (d)弹栈操作 */
    cout << "\n弹栈操作...\n";
    while (!p->isEmpty()){
      p->pop(value);
      cout << value << " ";
    }
   
    /* (e)判栈空操作,栈中元素为 0 返回 true,否则返回 false; */
    cout << endl << "栈是否空?:" << (bool)p->isEmpty()<< endl;
       
    /* (f)判栈空操作,栈中元素 ≥100 返回 true,否则返回 false; */
    cout << "栈是否满?:" << (bool)p->isFull()<< endl;
   
    cout << endl;
    return 0;
}

学不会绝不改名 发表于 2021-12-28 19:11:08

傻眼貓咪 发表于 2021-12-28 19:03
我的代码有三点必须注意:
1.)采用头文件和源文件编写,在运行之前,请自行确保路径与设定无误(不要问我 ...

谢谢,分享{:5_110:}
关于第三点为什么跳跃,属实一两句话说不完,一言难尽。
本来要发悬赏的,现在等级不够,不能悬赏渔币,再次感谢分享!

傻眼貓咪 发表于 2021-12-28 19:12:44

学不会绝不改名 发表于 2021-12-28 19:11
谢谢,分享
关于第三点为什么跳跃,属实一两句话说不完,一言难尽。
本来要发悬赏的,现在等 ...

{:5_108:}
页: [1]
查看完整版本: 编写一个类实现如下功能