谈起堆栈,我想起兄弟。中国的汉语真是有意思,兄弟说的是弟,同理,堆栈,强调的是栈。栈是一种受限的线性表。
作为一种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);
}
}