posts - 183,  comments - 10,  trackbacks - 0
连续内存,溢出
  1 #include <iostream>
  2 using namespace std;
  3 
  4 template <typename T>
  5 class DoulStack
  6 {
  7 private:
  8     T* data_;
  9     int top1_;
 10     int top2_;
 11     unsigned size_;
 12 public:
 13     DoulStack(unsigned size = 1000) : data_(new T[size]), top1_(0), top2_(size - 1), size_(size)
 14     {
 15         if (data_ == 0)
 16         {
 17             exit(1);
 18         }
 19     }
 20     DoulStack(const DoulStack& ds) : data_(new T[ds.size_]), top1_(ds.top1_), top2_(ds.top2_), size_(ds.size_)
 21     {
 22         if (data_ == 0)
 23         {
 24             exit(1);
 25         }
 26         memcpy(data_, ds.data_, sizeof (T) * ds.size_);
 27     }
 28     DoulStack& operator = (const DoulStack& ds)
 29     {
 30         if (this != &ds)
 31         {
 32             delete [] data_;
 33             data_ = new T[ds.size_];
 34             if (data_ == 0)
 35             {
 36                 exit(1);
 37             }
 38             top1_ = ds.top1_;
 39             top2_ = ds.top2_;
 40             size_ = ds.size_;
 41             memcpy(data_, ds.data_, sizeof (T) * ds.size_);
 42         }
 43         return *this;
 44     }
 45     ~DoulStack()
 46     {
 47         delete [] data_;
 48     }
 49     bool empty()
 50     {
 51         return empty1() && empty2();
 52     }
 53     bool full()
 54     {
 55         return top1_ - 1 == top2_;
 56     }
 57     bool resize(unsigned size)
 58     {
 59         T* temp = new T[size];
 60         if (temp == 0)
 61         {
 62             exit(1);
 63         }
 64         for (int i = 0; i != top1_; ++i)
 65         {
 66             temp[i] = data_[i];
 67         }
 68         for (int i = size - 1, j = size_ - 1; j != top2_; --i, --j)
 69         {
 70             temp[i] = data_[j];
 71         }
 72         size_ = size;
 73         delete [] data_;
 74         data_ = temp;
 75     }
 76     void push1(const T& t)
 77     {
 78         if (full())
 79         {
 80             resize(size_ * 2);
 81         }
 82         data_[top1_++= t;
 83     }
 84     void push2(const T& t)
 85     {
 86         if (full())
 87         {
 88             resize(size_ * 2);
 89         }
 90         data_[top2_--= t;
 91     }
 92     void pop1()
 93     {
 94         --top1_;
 95     }
 96     void pop2()
 97     {
 98         ++top2_;
 99     }
100     T top1()
101     {
102         return data_[top1_ - 1];
103     }
104     T top2()
105     {
106         return data_[top2_ + 1];
107     }
108     bool empty1()
109     {
110         return top1_ == 0;
111     }
112     bool empty2()
113     {
114         return top2_ == size_ - 1;
115     }
116 };
117 
118 int main()
119 {
120     DoulStack<int> ds;
121     for (int i = 0; i < 10++i)
122     {
123         ds.push1(i);
124         ds.push2(9 - i);
125     }
126     while (!ds.empty1())
127     {
128         cout << ds.top1() << endl;
129         ds.pop1();
130     }
131     while (!ds.empty2())
132     {
133         cout << ds.top2() << endl;
134         ds.pop2();
135     }
136     cout << ds.empty() << endl;
137 }

posted on 2011-06-17 15:30 unixfy 阅读(143) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理