顺序栈

顺序栈

顺序栈定义

用顺序存储结构实现的栈,即利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时

由于栈的操作的特殊性,还必须附设一个栈顶指针(top)来动态的指示栈顶元素在顺序栈中的位置。

通常以 top= -1 表示栈空。

 

 

 

结构体定义

struct SeqStack{
    int MAXNUM;
    int t;
    DataType *element;
};
typedef SeqStack* PSeqStack;

 

 

顺序栈基本运算

算法3.1 创建空栈

PSeqStack createEmptyStack_seq( void )

算法3.2 判断栈是否为空栈

int isEmptyStack_seq( PSeqStack pastack )

算法3.3 进栈

void push_seq( PSeqStack pastack, DataType x )

算法3.4 出栈

void pop_seq( PSeqStack pastack )

算法3.5 取栈顶元素

DataType top_seq( PSeqStack pastack )

 

顺序栈元素"入栈"

比如,还是模拟栈存储 {1,2,3,4} 的过程。最初,栈是"空栈",即数组是空的,top 值为初始值 -1,如图 1 所示:

图 1 空栈示意图

 

首先向栈中添加元素 1,我们默认数组下标为 0 一端表示栈底,因此,元素 1 被存储在数组 a[1] 处,同时 top 值 +1,如图 2 所示:

图2 模拟栈存储元素 1

 

采用以上的方式,依次存储元素 2、3 和 4,最终,top 值变为 3,如图3 所示:

图 3 模拟栈存储{1,2,3,4}

 

 

创建空栈

PSeqStack createEmptyStack(int m){
    PSeqStack pstack;
    pstack = (PSeqStack)malloc(sizeof(SeqStack));
    if (pstack!=NULL)
    {
        pstack->element=(DataType*)malloc(sizeof(DataType)*m);
        if (pstack->element!=NULL)
        {
            pstack->MAXNUM=m;//最大长度设置为m
            pstack->t=-1;//栈顶指针总是指向栈顶元素
            return pstack;
        }
        else
        {
            free(pstack);
        }
    }
    //创建失败
    cout<<"Out of space"<<endl;
    return NULL;
}

 

 

 

判断栈是否为空

//判断栈是否为空
int isEmpty_stack(PSeqStack pstack){
    return pstack->t==-1;
}

 

 

进栈操作

void push_stack(PSeqStack pastack,DataType e){
    if (pastack->t>=pastack->MAXNUM-1)
    {
        cout<<"Overflow "<<endl;
    }else
    {
        pastack->t=pastack->t+1;//栈顶往上移
        pastack->element[pastack->t]=e;//添加元素
    }
}

 

 

出栈操作

 

其实,top 变量的设置对模拟数据的 "入栈" 操作没有实际的帮助,它是为实现数据的 "出栈" 操作做准备的。

比如,将图 5 中的元素 2 出栈,则需要先将元素 4 和元素 3 依次出栈。需要注意的是,当有数据出栈时,要将 top 做 -1 操作。因此,元素 4 和元素 3 出栈的过程分别如图 6a) 和 6b) 所示:

                 

void pop_stack(PSeqStack pastack){
    if (pastack->t==-1)//栈为空
    {
        cout<<"not exits element"<<endl;
    }else
    {
        pastack->t--;//使用新元素直接覆盖原来的元素,假装其不存在
    }
}

 

 

获取栈顶元素

 

DataType get_Top(PSeqStack pastack){
    if (pastack->t==-1)
    {
        cout<<"empty"<<endl;
        return 'e';
    }else
    {
        return pastack->element[pastack->t];
    }
}

 


posted @ 2020-05-28 20:39  关注我更新论文解读  阅读(126)  评论(0编辑  收藏  举报