目录
栈的原理
栈是限制在一端进行插入操作和删除操作的线性表(俗称堆栈)
允许进行操作的一端称为“栈顶”
另一固定端称为“栈底”
当栈中没有元素时称为“空栈”。特点 :后进先出(LIFO)。
栈的应用
顺序栈的定义
它是顺序表的一种,具有顺序表同样的存储结构,由数组定义,配合用数组下标表示的栈顶指针top(相对指针)完成各种操作。
typedef int data_t ; /*定义栈中数据元素的数据类型*/
typedef struct
{
data_t *data ; /*用指针指向栈的存储空间*/
int maxlen; /*当前栈的最大元素个数*/
int top ; /*指示栈顶位置(数组下标)的变量*/
} sqstack, *stacklink; /*顺序栈类型定义*/
创建栈
stacklink stack_creat(int len){
stacklink s;
//判断栈申请成功
if((s=(stacklink)malloc(sizeof(stacklink)))==NULL){
printf("malloc stack_create failed\n");
return NULL;
}
//判断数据空间申请成功
if((s->data = (data_t *)malloc(len * sizeof(stacklink)))==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(stacklink s,data_t value){
if(s == NULL){
printf("stack is null\n");
return -1;
}
if(s->top == s->maxlen-1){
printf("stack is full\n");
return -1;
}
//top是下标,入栈成功需要+1
s->top++;
s->data[s->top] = value;
return 0;
}
判断空
int stack_empty(stacklink s){
if(s == NULL){
printf("stack is null\n");
return -1;
}
return ((s->top==-1)?1:0);
}
判断满
int stack_full(stacklink s){
if(s == NULL){
printf("stack is null\n");
return -1;
}
return(s->top==s->maxlen-1?1:0);
}
出栈
data_t stack_pop(stacklink s){
s->top--;//data[top]本身的元素还在,但是逻辑上已经不在栈里面了
return (s->data[s->top+1]);
}
栈顶元素
data_t stack_top(stacklink s){
return (s->data[s->top]);
}
删除栈
int stack_free(stacklink s){
if(s == NULL){
printf("s is NULL\n");
return -1;
}
if(s->data!=NULL){
free(s->data);
}
free(s);
return 0;
}
清空栈
int stack_clear(stacklink s){
if(s == NULL){
printf("s is NULL\n");
return -1;
}
s->top = -1;
return 0;
}
链式栈的定义
插入操作和删除操作均在链表头部进行,链表尾部就是栈底,栈顶指针就是头指针。
typedef int data_t ; /*定义栈中数据元素数据类型*/
typedef struct node_t {
data_t data ; /*数据域*/
struct node_t *next ; /*链接指针域*/
} linkstack_t,*linkstack; /*链栈类型定义*/
创建栈
linkstack stack_create(){
linkstack s;
s = (linkstack)malloc(sizeof(linknode));
if(NULL == s){
printf("malloc create failed\n");
return NULL;
}
s->data = 0;
s->next = NULL;
return s;
}
入栈
int stack_push(linkstack s,int value){
linkstack p;
if(NULL == s){
printf("s is NULL\n");
return -1;
}
p = (linkstack)malloc(sizeof(linknode));
if(p == NULL){
printf("push malloc failed\n");
return -1;
}
p->next = s->next;
p->data = value;
s->next = p;
return 0;
}
出栈
data_t stack_pop(linkstack s){
linkstack p;
data_t t;
p = s->next;
s->next = p->next;
t = p->data;
free(p);
p = NULL;
return t;
}
判断空
int stack_empty(linkstack s){
if(s == NULL){
printf("s is NULL\n");
return -1;
}
return (s->next == NULL?1:0);
}
栈顶元素
data_t stack_top(linkstack s){
if(s == NULL){
printf("s is NULL\n");
return -1;
}
return(s->next->data);
}
删除栈
linkstack stack_free(linkstack s){
if(s == NULL){
printf("s is NULL\n");
return NULL;
}
linkstack p;
p = s;
while(s){
s = s->next;
printf("free:%d\n",p->data);
free(p);
p = s;
}
p = NULL;
return NULL;
}
输出栈元素
linkstack stack_show(linkstack s){
linkstack p;
p = s->next;
while(p!=NULL){
printf("%d\n",p->data);
p = p->next;
}
return s;
}