前言
请简述栈和线性表有什么关系
栈是一种特殊的线性表,它具有后进先出(LIFO)的特点、栈的插入和删除操作只能在栈的一端进行,这一端被称为栈顶
栈顶是线性表的唯一可访问的元素、栈的另一端被称为栈底、栈的插入操作称为入栈(push),删除操作称为出栈(pop)
可以说栈是一种基于线性表的数据结构,它通过限制插入和删除操作的位置,实现了后进先出的特性
提示:以下是本篇文章正文内容,下面案例可供参考
一、栈??
Stack(栈)
栈是限定在表的一端进行插入和删除运算的线性表,通常将 插入、删除的一端称为栈顶,另一端称为栈底
不含元素的称为空栈
栈的操作具有先进后出、后进先出(LIFO)的特点
栈的运算主要有置空栈、判栈空、判栈满、进栈、退栈和取栈顶元素六种
二、写出顺序栈实现时用的结构体;
1.创建顺序栈
代码如下(示例):
typedef int data_t;
typedef struct {
data_t *data;
int maxlen;
int top;
}sqstack;
sqstack * stack_create(int len);
int stack_push(sqstack * s, data_t value);
int stack_empty(sqstack *s);
int stack_full(sqstack *s);
data_t stack_pop(sqstack *s);
data_t stack_top(sqstack *s);
int stack_clear(sqstack *s);
int stack_free(sqstack *s);
2.写出顺序栈各个功能的代码块
代码如下(示例):
sqstack * stack_create(int len) {
sqstack * s;
if ((s =(sqstack *)malloc(sizeof(sqstack))) == NULL) {
printf("malloc sqstack failed\n");
return NULL;
}
if ((s->data = (data_t *)malloc(len * sizeof(data_t)))==NULL) {
printf("malloc data failed\n");
free(s);
return NULL;
}
memset(s->data, 0, len*sizeof(data_t));
s->maxlen = len;
s->top = -1;
return s;
}
int stack_push(sqstack * s, data_t value) {
if (s == NULL) {
printf("s is NULL\n");
return -1;
}
if (s->top == s->maxlen-1) {
printf("stack is full\n");
return -1;
}
s->top++;
s->data[s->top] = value;
return 0;
}
/*
*@ret 1-empty
* */
int stack_empty(sqstack *s) {
if (s == NULL) {
printf("s is NULL\n");
return -1;
}
return (s->top == -1 ? 1 : 0);
}
/*
* @ret 1-full
* */
int stack_full(sqstack *s) {
if (s == NULL) {
printf("s is NULL\n");
return -1;
}
return (s->top == s->maxlen-1 ? 1 : 0);
}
data_t stack_pop(sqstack *s) {
s->top--;
return (s->data[s->top+1]);
}
data_t stack_top(sqstack *s) {
return (s->data[s->top]);
}
int stack_clear(sqstack *s) {
if (s == NULL) {
printf("s is NULL\n");
return -1;
}
s->top = -1;
return 0;
}
int stack_free(sqstack *s) {
if (s == NULL) {
printf("s is NULL\n");
return -1;
}
if (s->data != NULL)
free(s->data);
free(s);
return 0;
}
3.运行顺序栈
int main(int argc, const char *argv[])
{
sqstack *s;
s = stack_create(100);
if (s == NULL)
return -1;
stack_push(s, 10);
stack_push(s, 20);
stack_push(s, 30);
stack_push(s, 40);
while (!stack_empty(s)) {
printf("pop: %d \n", stack_pop(s) );
}
stack_free(s);
return 0;
}