数据结构-顺序栈

156 阅读2分钟

顺序栈

栈的结构以及栈结构体(stack)定义

和以后要说到的队列一样,栈是一种特殊的线性表,因为栈只允许在顺序表的一端进行插入以及删除操作,在另一端或者是在顺序表的其他位置进行这些操作都是不被允许的。

struct stack {
    int top;
    int data[max_num];
};

栈的初始化

void new_stack(stack &s) {
    s.top = -1;
}

栈要想进行初始化,除了要保证栈所在的数组是空的,还要保证栈顶指针top的值为-1(代表目前最高位元素在栈中的下标为-1,即栈里没有数据元素,这也是栈进行判空的重要依据)。

栈的判空

bool isEmpty(stack s) {
    if (s.top == -1) return true;
    return false;
}

上面提到过栈的判空,就是看栈顶指针top的值,如果栈的top值大于等于0,就说明这个栈是非空的(等于0代表栈中最高位元素下标为0,即栈中有一个元素),返回false;如果top值等于-1,就说明这个栈是空的,栈中没有任何数据元素,返回true。

进栈(push)

void push(stack &s, int x) {
    if (s.top == max_num - 1) return;
    s.top++;
    s.data[s.top] = x;
}

栈最重要的两大操作之一,就是栈中的插入操作,只不过只有两个参数,分别代表所操作的栈和所要插入的数。函数运行时首先判断栈是否已经满了,即栈的最高位数据元素是否到达顺序表的最大容量,如果到达了就直接结束函数。如果栈没有满,就先将top指针+1,再将数据参数的值赋值到顺序表下标为top的位置。

(这里一定要先将top指针+1再赋值)

出栈(pop)

void pop(stack &s) {
    if (s.top == -1) return;
    s.top--;
}

栈最重要的两大操作之二,就是栈的删除操作,不过栈只能对栈顶数据元素进行删除,参数只有一个,即所要操作的栈。函数运行时首先判断要操作的栈是否是空栈,如果是就直接结束函数。如果没有,就直接将栈的top指针-1即可。

取栈顶元素

int getTop(stack s) {
    if (s.top == -1) return -9999;
    return s.data[s.top];
}

首先是判空栈,如果栈为空就直接返回-9999,如果不为空,返回栈当中下标为top的数据元素。