先declare下,此堆栈(stack)不是内存中的stack,而是一种十分重要的数据结构,后进先出(LIFO)的数据结构。
堆栈区别于树和图,是一种顺序结构,它只能在一端进行增加元素,或者删除元素的操作。这个所谓的“端” 就是栈顶。一个stack当且仅当一个元素没有时,是空栈。
作为一种data structure,它相关的操作主要有以下几类:
1)create一个堆栈,并初始化
2)判断是不是空栈。空栈的意思刚说过了
3)判断堆栈有没有满。实际中这个意义不大,因为从语言层面很多语言已经把栈的容量自动扩展了
4)插入元素
5)删除元素
6)获取栈顶元素
7)求堆栈的size,也就是元素个数
8)销毁堆栈
堆栈的实现,根据存储结构的不同,可以有两种方式。顺序存储对应顺序堆栈,链式存储对应链接堆栈。根据不同的存储结构,操作的实现也有所区别
一、顺序堆栈
#define m 100
typedef struct
{
int data[m]; //数据域
int top; // 栈顶指针
}stack;
现在依次来看下顺序堆栈的操作
1)create堆栈
void createStack(stack *&s)
{
s = (stack*)malloc(sizeof(stack));
s->top = -1;
}
2)判断栈是不是空
bool isEmpty(stack *&s)
{
return (s->top == -1);
}
3)判断顺序堆栈是不是满了
bool isFull(stack *&s)
{
return (s->top == m-1);
}
4)增加一个元素
void push(stack *&s, int elem)
{
if(s != NULL) {
s->top++;
s->data[s->top] = elem;
}
}
5)弹出一个元素,也就删除一个元素
void pop(stack *&s)
{
if (s != NULL && s->top != -1) {
s->top--;
}
}
6)获取栈顶元素
int top(stack *&s)
{
if (s != NULL && s->top != -1) {
return (s->data[s->top]);
}
}
7)获取堆栈的size
int size(stack *&s)
{
if (s != NULL) {
return (s->top+1);
}
}
8)销毁堆栈
void destroyStack(stack *&s)
{
if (s != NULL) {
free(s);
}
}
2、链式堆栈
先看下链式堆栈的结构定义
typedef struct node
{
int data; //数据域
struct node *next; // 栈顶指针
}stack;
现在依次来看下顺序堆栈的操作
1)create堆栈。这里只是创建了一个堆栈结点,并且作为头结点,本身的数字域是不存的。
void createStack(stack *&s)
{
s = (stack*)malloc(sizeof(stack));
s->next = NULL;
}
2)判断栈是不是空。因为链式堆栈中的第一个node不进行实际的内容存储,所以当且仅当next指向空的时候,链式堆栈是空。
bool isEmpty(stack *&s)
{
return (s->next == NULL);
}
3)判断顺序堆栈是不是满了。由于使用链表结构实现堆栈的时候,只要进行链接新node的操作,堆栈的长度就可以一直增加,不存在上溢出的问题。所以当使用链式堆栈的时候,不需要判断堆栈是否已满。
4)增加一个元素
void push(stack *&s, int elem)
{
if(s != NULL) {
node *tail = s;
while(tail->next != NULL) { //tail指向s的最后一个节点
tail = tail->next;
}
node *node = (stack*)malloc(sizeof(stack));
node.data = elem;
node->next = NULL;
tail->next = node;
free(tail);
}
}
5)弹出一个元素,也就删除一个元素
void pop(stack *&s)
{
if (s != NULL && s->top != -1) {
s->top--;
}
}
6)获取栈顶元素
int top(stack *&s)
{
if (s != NULL && s->top != -1) {
return (s->data[s->top]);
}
}
7)获取堆栈的size
int size(stack *&s)
{
if (s != NULL) {
return (s->top+1);
}
}
8)销毁堆栈
void destroyStack(stack *&s)
{
if (s != NULL) {
free(s);
}
}