参考资料:Data Structures, Algorituhms, and Applications in c++ 中文版 164页程序 此题特别感谢炮姐给我解惑!!!!
程序是定义一个stack类作为堆栈操作的类 , top指向栈顶, MaxTop指出最大栈顶值
* stack 指向堆栈元素数组#ifndef HEADER_1_H_
#define HEADER_1_H_
//#include <cstdlib>
template <class T>
class Stack{
public:
Stack( int MaxStackSize = 10 ); //构造函数
~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;//+ 输出栈中元素
Stack < T > &Chaifen();//+
/*具体功能,将现有栈拆分为两个栈, 第一部分包含从栈底开始的一般元素,第二部分包含其余的元素,然后把第二部分栈的所有元素放到第一个栈的顶部,并且第二个栈的元素的相对次序不发生改变。*/
private:
int top;
int MaxTop;
T *stack;
};
template < class T >Stack< T >::Stack( int MaxStackSize )
{MaxTop = MaxStackSize - 1;
stack = new T[ MaxStackSize ];
top = -1;}
template < class T >T Stack< T >::Top() const
{
if( IsEmpty() )//change
{cout<<"空栈" <<endl;exit( 1 );}
else
return stack[ top ];
}
template < class T >Stack < T >& Stack < T >::Add( const T & x )
{if( IsFull() )//change
{cout<<"栈满" <<endl;
exit( 1 );
}
stack[ ++top ] = x;
return *this;
}
template < class T >Stack< T >& Stack< T >::Delete( T & x )
{
if( IsEmpty() )//change
{cout<<"空栈" <<endl;
exit( 1 );
}
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 ++change
T *pstr = new T [ top + 1 ];//new changestring stra;
for( int i = 0; i < top + 1; i++ )//加了个中间变量
{stra = stack[i];
pstr[ i ] = stra;
}
if( top % 2 == 1 )
{
string 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 )
{
string 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
{
int tw = top;
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()
{
Stack<string> sta( 15 );
string stra[15] = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j"};
int coutof = _countof( stra );//计算固定string[]中一维数组个数
cout<<coutof <<endl;
for( int i = 0; i < coutof; i++ )
sta = sta.Add( stra[i] );
sta = sta.Chaifen();//+
sta.show();//+
while( sta.Toplocate() != -1 )//删除栈中所有元素
{
string strb;sta = sta.Delete( strb );
cout<<strb <<" chuzhan "<<endl;
}
return 0;
}