首页 > 其他 > 详细

顺序栈

时间:2014-04-07 14:17:10      阅读:634      评论:0      收藏:0      [点我收藏+]

形态:

bubuko.com,布布扣bubuko.com,布布扣

实现:

/***********************************************
栈的顺序存储形式
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;
}



顺序栈,布布扣,bubuko.com

顺序栈

原文:http://blog.csdn.net/chdjj/article/details/23096647

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!