data structures and application 5.3.2完整版 ( 栈的实现 )

来源:互联网 发布:淘宝如何购买流量 编辑:程序博客网 时间:2024/06/05 04:48

此篇文章仅供个人学习记录之用,题目是Data Structures, Algorithms, and Applications in C++中 5.3.2中的例题进行扩展的练习题目,代码如下:
#ifndef HEADER_1_H_#define HEADER_1_H_//#include <cstdlib>template <class T>class Stack{public:Stack( T& x );//构造函数~Stack() { delete [] stack; }//析构函数//void s_stack() { delete [] stack; }//仿析构函数,后来发现其实析构函数和这个函数是一
//样的。。bool IsEmpty() const { return top == -1; }bool IsFull() const { return top == MaxTop; }T Top() const;Stack < T > &Add( const T& x );//此函数具有自动调整栈空间大小的功能Stack < T > &Delete( T &x );//此函数具有自动调整栈空间大小的功能int Toplocate() { return top; }//返回栈顶值void show() const;//+输出栈中元素int MaxTop_() const { return MaxTop; }//返回MaxTop值 ,函数不可以重名。。Stack < T > &Chaifen();//+拆分函数/*具体功能,将现有栈拆分为两个栈, 第一部分包含从栈底开始的一般元素,第二部分包含其余的元素,然后把第二部分栈的所有元素放到第一个栈的顶部,并且第二个栈的元素的相对次序不发生改变。*/private:int top;int MaxTop;T *stack;};template < class T >Stack< T >::Stack( T &x ){MaxTop = 0;top = -1;stack = NULL;}template < class T >T Stack< T >::Top() const{if( IsEmpty() )//change{cout<<"空栈" <<endl;exit( 1 );}elsereturn stack[ top ];}template < class T >Stack < T >& Stack < T >::Add( const T & x ){if( ( MaxTop - 1 ) == top && top != -1 ){T * dumpstack = new T [ MaxTop + 1 ];T dump_str;for( int i = 0; i <= top; i++ ){dump_str = stack[ i ];dumpstack[ i ] = dump_str;}MaxTop = 2 * MaxTop + 1;delete [] stack;stack = new T [ MaxTop ];for( int i = 0; i <= top; i++ ){dump_str = dumpstack[ i ];stack[ i ] = dump_str;}delete [] dumpstack;}if( MaxTop == 0 && top == -1 )//克服内存泄露的修改,从构造函数中拿到这里来了/*这里错了, 应该在第一次判断之后,MaxTop = 1;  以便在后面MaxTop = 2*MaxTop + 1时 变成3*/{stack = new T [1];MaxTop = 1;//change}stack[ ++top ] = x;//为什么这里忘了加= x.....return *this;}template < class T >Stack< T >& Stack< T >::Delete( T& x )//把参数去掉了,感觉没什么用{if( ( MaxTop / 4 ) > top ){T *dumpstack = new T [ top + 1 ];T dump_str;for( int i = 0; i <= top; i++ ){dump_str = stack[ i ];dumpstack[ i ] = dump_str;}MaxTop = MaxTop / 2;delete [] stack;            stack = new T [ MaxTop ];for( int i = 0; i <= top; i++ ){dump_str = dumpstack[ i ];stack[ i ] = dump_str;}delete [] dumpstack;}x = stack[ top-- ];//return *this;}template < class T >Stack< T > & Stack<T>:: Chaifen()//++ T &x {int halflen = top / 2;if ( halflen == 0 )//判断栈元素是否可以拆分  ++change{cout<<"栈元素过少不能拆分" <<endl;return *this;}//T *pstr[ top + 1 ] = new T [ top + 1 ];//string 改成 T      ++changeT *pstr = new T [ top + 1 ];//new changeT stra;for( int i = 0; i < top + 1; i++ )//加了个中间变量{stra = stack[i];pstr[ i ] = stra;}if( top % 2 == 1 ){T strb;for( int i = halflen,  j = top; i >= 0; i--, j-- )//加了个中间变量{strb = pstr[i];//*stack[ j ] = *pstr[ i ];stack[j] = strb;}}else if( top % 2 == 0 ){T strc;for( int i = halflen - 1,  j = top; i >= 0; i--, j-- )//加了个中间变量{strc = pstr[i];stack[ j ] = strc;//*stack[ j ] = *pstr[ i ];}}else;delete [] pstr;return *this;}template < class T >void Stack< T >::show(  ) const//++ T& x{cout<<"top = "<< top <<" show stack: " <<endl;//++for( int i = 0; i <= top; i++ )//cout<<*stack[ i ] <<" ";cout<<stack[i] <<" ";cout<<"栈顶" <<endl;}#endif


//头文件结束

#include < iostream>

#include < string >#include "header_1.h"using namespace std;int main(){string strin = " ";Stack<string>  sta( strin );string stra[15] = {"aaaee", "brrrrrrrre", "cssss", "dddd", "eeee", "fffff", "gssf", "hssfgh", "iiii", "jj"};int coutof = _countof( stra );//计算固定string[]中一维数组个数cout<<coutof <<endl;for( int i = 0; i < coutof; i++ ){sta = sta.Add( stra[i] );cout<<"MaxTop: " << ( sta.MaxTop_() - 1 ) <<endl;}sta = sta.Chaifen();//+sta.show();//+while( sta.Toplocate() != -1 )//删除栈中所有元素{string strb;sta = sta.Delete( strb );cout<<strb <<"  chuzhan "<<"  MaxTop: " <<( sta.MaxTop_() - 1 ) <<endl;}//sta.s_stack();//仿析构函数return 0;}
此程序经过vs2010调试成功,开始的时候还感觉有内存泄露,可能是因为在分配stack时把他的分配放在了构造函数中,在中途对stack变量进行多次delete 和 new 之后在析构时出现问题,把构造函数修改之后就调试成功了。