重要的数据结构--堆栈

先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);
     }
}








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值