顺序栈
栈的结构以及栈结构体(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的数据元素。