形态:
实现:
/***********************************************
栈的顺序存储形式
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