堆栈了解

谈起堆栈,我想起兄弟。中国的汉语真是有意思,兄弟说的是弟,同理,堆栈,强调的是栈。栈是一种受限的线性表。

作为一种data structure,它相关的操作主要有以下几类:

1)create一个堆栈,并初始化

2)判断是不是空栈。空栈的意思刚说过了

3)判断堆栈有没有满。实际中这个意义不大,因为从语言层面很多语言已经把栈的容量自动扩展了

4)插入元素

5)删除元素

6)获取栈顶元素

7)求堆栈的size,也就是元素个数

8)销毁堆栈

堆栈也分储存结构,根据储存结构的不同,分为顺序堆栈和链式堆栈

1,顺序堆栈操作:

#define m 100
typedef struct
{
    int data[m]; //数据域
    int top; // 栈顶指针
}stack;

1)创建堆栈:

void createStack(stack *&s) 
{
    s = (stack*)malloc(sizeof(stack));//给stack型数据申请sizeof(stack)的空间
    s->top = -1;//设置栈顶,规则不定,后面判断空栈的依据
}

2)判断空栈:

bool isEmpty(stack *&s)
{
    return (s->top == -1);
}

3)判断栈是不是满了:

bool isfull()
{
 return s->top==m-1;
}

4)增加元素:由于堆是一种无序的数据结构,只需要增加元素不需要插入元素。

void push(stack *&s, int elem)//elem要添加的元素
{
    if(s != NULL) {
       s->top++;
       s->data[s->top] = elem;
    }
}

链式堆栈:

结构定义:

typedef struct node//类似链表
{
    int data; //数据域
    struct node *next; // 栈顶指针
}stack;

1)创建stack:

void createStack(stack *&s) //区别在于这个是用结点进行操作,而顺序堆栈使用栈顶操作
{
    s = (stack*)malloc(sizeof(stack));
    s->next = NULL;
}

2)判断是不是空栈:

bool isfull()
{
 return s->next==NULL;
}

因为链式堆栈长度可以一直增加,所以不存在判断是否满了。

3)增加元素:

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值