栈
前言
栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
提示:以下是本篇文章正文内容,下面案例仅供参考
一、栈是什么?
栈(stack)又名堆栈,它是一种运算受限的线性表。或者说是特殊的(顺序表、单链表)链表
二、顺序表栈实现
1.创建一个Stack的struct数据类型
代码如下(示例):
typedef int MY_DATA;
// this is sequence list stack templant
typedef struct{
MY_DATA *data;
int length;
int top;
}sqslink;
2.创建
代码如下(示例):
sqslink * initStack(int length){
sqslink *s;
if((s = (sqslink *)malloc(sizeof(sqslink))) == NULL){
printf("stack malloc failed!\n");
return NULL;
}
if((s->data = (MY_DATA *)malloc(length * sizeof(MY_DATA)))== NULL){
printf("stack data malloc failed!\n");
free(s);
return NULL;
}
memset(s->data, 0, length*sizeof(MY_DATA)); // initialization data
s->length = length;
s->top = -1;
return s;
}
3. 相关操作 push / pop / free
代码如下(示例)
// @ pop stack
MY_DATA popStack(sqslink *s){
s->top--;
return (s->data[s->top+1]);
}
// @ view top
MY_DATA topStack(sqslink *s){
return (s->data[s->top]);
}
// @ check whether is empty
int emptyStack(sqslink *s){
if(!s){
printf("stack NULL\n");
return -1;
}
return (s->top == -1 ? 1 : 0);
}
// @ check whether is full
int fullStack(sqslink *s){
if(!s){
printf("stack NULL\n");
}
return (s->top == s->length-1 ? 1 : 0);
}
// clear empty stack
int clearStack(sqslink *s){
if(!s){
printf("stack NULL\n");
return -1;
}
s->top = -1;
return 0;
}
// @ free malloc
int freeStack(sqslink *s){
if(!s){
printf("stack NULL\n");
}
if(s->data != NULL) free(s->data);
free(s);
return 0;
}
三、单链表栈实现
1.创建一个Stack的struct数据类型
typedef int MY_DATA;
// create single linked list stack node template
typedef struct Link{
MY_DATA elem;
struct Link *next;
}link, *LinkStack;
2.操作
// @ initialization stack node
LinkStack initStack(){
LinkStack s;
if((s = (LinkStack)malloc(sizeof(link))) == NULL){
printf("malloc faild!!\n");
return NULL;
}
s->elem = 0;
s->next = NULL;
return s;
}
// @ push stack
int pushStack(LinkStack s, MY_DATA elem){
LinkStack t;
if(!s){
printf("your s is NULL!\n");
return -1;
}
if((t = (LinkStack)malloc(sizeof(link))) == NULL){
printf("malloc failed!!!\n");
return -1;
}
t->elem = elem;
//t->next = NULL;
t->next = s->next;
s->next = t;
return 0;
}
// @ pop stack
MY_DATA popStack(LinkStack s){
LinkStack t;
MY_DATA a;
t = s->next;
s->next = t->next;
a = t->elem;
free(t);
t = NULL;
return a;
}
// @ check stack empty
int emptyStack(LinkStack s){
if(!s){
printf("your \'s\' is NULL!\n");
return -1;
}
return (s->next == NULL ? 1 : 0);
}
// show stack top
MY_DATA topStack(LinkStack s){
return (s->next->elem);
}
// free malloc
LinkStack freeStack(LinkStack s){
LinkStack t;
if(!s){
printf("your \'s\' is NULL!\n");
return NULL;
}
while(s){
t = s;
s = s->next;
printf("free:%d\n",t->elem);
free(t);
}
return NULL;
}
总结
栈是限制在一端进行插入操作和删除操作的线性表(俗称堆栈)
允许进行操作的一端称为“栈顶”
另一固定端称为“栈底”
当栈中没有元素时称为“空栈”。特点 :后进先出(LIFO)。