这是个数组实现的栈。优点在于可以随着栈中元素的增加调节数组的大小。 在其中多理解指针吧。指针空间 的申请,指向。指针的运算。都可以在其中有所体会。 /* author:Star Data:2011.04.20 一个动态数组实现的简单栈.帮助理解动态数组。 */ #include<iostream> #include<stdio.h> #include<malloc.h> using namespace std; typedef int ElemType; typedef int Status; #define ERROR 0 #define OK 1 #define OVERFLOW 0 #define STACK_INIT_SIZE 100; #define STACKINCREMENT 10;//栈空间增量大小 typedef struct { ElemType *base; ElemType *top;//栈顶指针即每次插入删除数据都用栈顶 int stacksize;//已分配存储空间 }SqStack; Status InitStack( SqStack &S ) {//构造一个空栈 S.base = ( ElemType * ) malloc ( sizeof( ElemType ) ); if( !S.base ) exit( OVERFLOW ); S.top = S.base ; S.stacksize = STACK_INIT_SIZE; return OK; } Status GetTop( SqStack S, ElemType &e ) {//若栈不空,则用e返回栈顶元素 if( S.base == S.top ) return ERROR; e = * ( S.top - 1 ); return OK; } Status Push( SqStack &S, ElemType e ) {//插入元素e为新的栈顶元素 if( S.top - S.base >=S.stacksize ) { int newSize = S.stacksize + STACKINCREMENT; S.base = ( ElemType * ) realloc ( S.base , newSize * sizeof( ElemType ) ); if( !S.base ) exit( OVERFLOW );//存储分配失败 S.top = S.base + S.stacksize; S.stacksize += STACKINCREMENT; } * S.top ++ =e;//这一句等于 *( S.top ) = e; S.top++ 运算符是右结合性的 return OK; } Status Pop( SqStack &S, ElemType &e ) {//若栈不空,则删除S的栈顶元素,用e返回其值 if( S.top == S.base ) return ERROR; e = * --S.top ;//即S.top--; e = *( S.top ) return OK; } void outStack( SqStack S ) { cout <<"“栈中元素”"<<endl; for( int i = 0; i < 5; i++) cout << S.base [ i ] << "、";//这里注意。因为只输入了5个元素,所以只输出了五个元素。 } int main() { SqStack stack; InitStack( stack ); for( int i = 0; i < 5; i++ ) Push( stack, i ); outStack( stack ); system("pause"); return 0; } //这是一个可动态调节数组大小实现的栈 VS2008下编译并且调试通过。