形态:
实现:
/*********************************************** 栈的顺序存储形式 by Rowandjj 2014/4/7 ***********************************************/ #include<iostream> using namespace std; #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 #define OK 1 #define ERROR 0 #define OVERFLOW 0 #define TRUE 1 #define FALSE 0 typedef int SElemType; typedef int Status; typedef struct _STACK_//栈的顺序存储结构 { SElemType *base;//栈底指针 SElemType *top;//栈顶指针,始终指在栈顶下一个元素 int stacksize;//栈容量 }SqStack; /*操作定义*/ Status InitStack(SqStack *S); Status DestroyStack(SqStack *S); Status ClearStack(SqStack *S); Status StackEmpty(SqStack S); int StackLength(SqStack S); Status GetTop(SqStack S,SElemType *e); Status Push(SqStack *S,SElemType e); Status Pop(SqStack *S,SElemType *e); Status StackTraverse(SqStack S,Status(*visit)(SElemType)); Status visit(SElemType e); /*实现*/ Status InitStack(SqStack *S) { (*S).base = (SElemType*)malloc(sizeof(SElemType)*STACK_INIT_SIZE); if(!(*S).base) { exit(OVERFLOW); } (*S).top = (*S).base; (*S).stacksize = STACK_INIT_SIZE; return OK; } Status DestroyStack(SqStack *S) { free((*S).base); (*S).base = (*S).top = NULL; (*S).stacksize = 0; return OK; } Status ClearStack(SqStack *S) { (*S).top = (*S).base; return OK; } Status StackEmpty(SqStack S) { if(S.top == S.base) { return TRUE; } else { return FALSE; } } int StackLength(SqStack S) { return S.top-S.base; } Status GetTop(SqStack S,SElemType *e) { *e = *(--S.top); return OK; } Status Push(SqStack *S,SElemType e) { if((*S).top - (*S).base >= STACK_INIT_SIZE) { (*S).base = (SElemType *)malloc((STACK_INIT_SIZE + STACKINCREMENT)*sizeof(SElemType)); if(!(*S).base) { exit(OVERFLOW); } (*S).top = (*S).base+(*S).stacksize; (*S).stacksize += STACKINCREMENT; } *((*S).top)++ = e; return OK; } Status Pop(SqStack *S,SElemType *e) { if((*S).top == (*S).base) { return ERROR; } *e = *--(*S).top; return OK; } Status StackTraverse(SqStack S,Status(*vi)(SElemType)) { while(S.top>S.base) { vi(*S.base++); } cout<<endl; return OK; } Status visit(SElemType e) { cout<<e<<" "; return OK; }
int main() { SqStack s; SElemType e; InitStack(&s); for(int i = 0 ; i < 6 ; i++) { cin>>e; Push(&s,e); StackTraverse(s,visit); cout<<"len = "<<StackLength(s)<<endl; } for(i = 0; i < 4; i++) { Pop(&s,&e); cout<<"e = "<<e<<endl; StackTraverse(s,visit); cout<<"len = "<<StackLength(s)<<endl; } return 0; }
原文:http://blog.csdn.net/chdjj/article/details/23096647