华为公司的笔试题:写一个Stack,注意处理异常。这里给出一个exception c++上讨论的一个简易版本代码。

本文介绍了一个通用模板栈类的实现细节,包括深拷贝、异常安全性和动态扩容等关键特性。该栈支持多种数据类型,并提供了类似标准库栈的操作接口。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

#include <iostream>
#include <exception>
#include <assert.h>

using namespace std;

template<typename T>
class Stack
{
public:
 Stack():v_(new T[10]),vused_(0),vsize_(10)
 {}

 Stack(const Stack& other):
 v_(newCopy(other.v_,other.vsize_,other.vsize_)),
  vused_(other.vused_),
  vsize_(other.vsize_)
 {}

 Stack& operator=(const Stack& other)
 {
  if (this != &other)
  {
   v_new = newCopy(other.v_,other.vsize_,other.vsize_);//may throw,delete after new success,pay attention;
   delete [] v_;
   v_ = v_new;
   vused_ = other.vused_;
   vsize_ = other.vsize_;
  }
  return *this;
 }

 ~Stack()
 {
  delete [] v_;
 }

 bool Empty()
 {
  return 0 == vused_;
 }

 int Count()const
 {
  return vused_;
 }

 void Push(const T& t)
 {
  if(vused_ == vsize_)
  {
   size_t vsize_new = 2*vsize_ + 1;
   T* v_new = newCopy(v_,vsize_,vsize_new);
   delete [] v_;
   v_ = v_new;
   vsize_ = vsize_new;
  }
  v_[vused_] = t;//may throw and make not strong exception-safe;
  vused_++;
 }

 void Pop()
 {
  if (vused_ == 0)
  {
   throw "pop from empty stack";
  }
  else
  {
   --vused_;
  }
 }

 T& Top()
 {
  if (vused_ == 0)
  {
   throw "empty stack";
  }
  return v_[vused_-1];
 }

private:
 T* newCopy(const T* src,size_t srcsize,size_t destsize)
 {
  assert(destsize >= srcsize);
  T* dest = new T[destsize];
  try
  {
   copy(src,src+srcsize,dest);
  }
  catch(...)
  {
   delete [] dest;
   throw;
  }
  return dest;
 }

private:
 T* v_;
 size_t vsize_;
 size_t vused_;
};

 

1、注意该栈实现的接口与标准库中实现的一致性,将pop的功能分离成pop和top

2、该类的异常安全性依赖于容器中实例元素的拷贝复制函数的异常安全性

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值