数据结构:栈的顺序存储结构及实现

栈的定义和抽象数据类型


栈是限定仅在表尾进行插入和删除操作的线性表。所以说栈也是线性表,栈元素具有线性关系,即前驱后继关系。

其抽象数据类型:

ADT 栈(Stack)
Data 
    同线性表,元素具有相同的类型,相邻元素具有前驱和后继关系。
Operation
    InitStack(*S):        初始化操作,建立一个空栈S。
    DestroyStack(*S):     若栈存在,则销毁它。
    ClearStack(*S):        将栈清空。
    StackEmpty(S):        若栈为空,返回true,否则返回false。
    GetTop(S,*e):         若栈存在且非空,用e返回S的栈顶元素。
    Push(*S,e):            若栈存在,插入新元素e到栈S中并成为栈顶元素。
    Pop(*S,*e):            删除栈S中栈顶元素,并用e返回其值。
    StackLength(S):        返回栈S中元素个数。
endADT

既然栈是顺序表的特例,那么先来看栈的顺序存储结构:顺序栈。定义一个top变量来指示栈顶元素在数组中的位置。既然top是数组的下标那么top的范围就是top属于[0, StackSize-1]。所以当栈存在一个元素的时候,top等于0,因此通常把空栈的判定条件定为top等于-1。

若存在一个栈,StackSize是5,三种情况的示意图:

栈的顺序存储结构的实现


#include <iostream>
#include <stdlib.h>
using namespace std;

#define MAXSIZE 20

typedef int SElemType;
typedef struct 
{
    SElemType data[MAXSIZE];
    int top;//栈顶指针
}SqStack;

/*初始化一个空栈*/
bool InitStack(SqStack *s)
{
    s->top = -1;
    return true;
}
/*将栈清空*/
bool ClearStack(SqStack *s)
{
    s->top = -1;
    return true;
}
/*判断栈是否为空*/
bool IsStackEmpty(SqStack s)
{
    if(s.top == -1)
    {
        return true;
    }
    else
    {
        return false;
    }
}
/*返回栈中元素的个数*/
int StackLength(SqStack s)
{
    cout << "Stack Length : ";
    return s.top + 1;
}

/*获取栈顶元素*/
bool GetTop(SqStack s, SElemType *e)
{
    if(s.top != -1)
    {
        *e = s.data[s.top];
        return true;
    }
    cout << "Get Top Item " << *e << endl;
    return false;
}
/*插入新元素到栈中,并成为栈顶元素*/
bool Push(SqStack *s, SElemType e)
{
    cout << "Push Item  " << e << endl;
    if(s->top == MAXSIZE - 1)
    {
        return false;
    }
    s->top++;
    s->data[s->top] = e;

    return true;
}

/*删除栈顶元素,用e返回取值*/
bool Pop(SqStack *s, SElemType *e)
{
    if(s->top == -1)
    {
        return false;
    }
    *e = s->data[s->top];
    s->top--;
    cout << "Pop Item  " << *e << endl;
    return true;
}
/*遍历栈中的元素,这个方法不是栈的操作,只是调试的时候观察数据*/
bool StackTraverse(SqStack s)
{
    cout << "Traverse Stack ..." << endl;
    if(s.top == -1)
    {
        return false;
    }
    for(int i = s.top; i >=0; i--)
    {
        cout << s.data[i] << ' ';
    }
    cout << endl;

    return true;
}


void main(void)
{
    SqStack sqStack;
    InitStack(&sqStack);

    for(int i = 0; i < 10; i++)
    {
        Push(&sqStack, i);
    }
    StackTraverse(sqStack);

    int result;
    Pop(&sqStack, &result);
    StackTraverse(sqStack);

    GetTop(sqStack, &result);

    if(!IsStackEmpty(sqStack))
    {
        cout << StackLength(sqStack) <<endl;
    }

    ClearStack(&sqStack);

    system("pause");
}

执行结果:

捕获

posted @ 2015-02-09 14:35  stemon  阅读(1432)  评论(0编辑  收藏  举报