栈是一种后进先出的限制性数据结构,结构理解较为简单,而链栈通过栈顶,栈底指针(栈底其实可以不用)来实现数据的修改及查询。链栈实现的关键是理解结构中指针的指向及其作用。
代码如下:(初始化栈,出栈,入栈,清空栈,获得栈顶元素,栈长,判断栈是否为空,遍历栈)
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define OVERflow -1
#define Error 0
#define OK 1
typedef struct ele//定义链栈元素结构体:包括两个部分:1.值;2.指向下一个元素的指针;
{
int data;
struct ele *next;
}element;
typedef struct{//定义链栈,包含一个栈顶指针和一个栈底指针;
element *top;
element *bottom;
}link_stack;
int init_stack(link_stack *sta)//链栈初始化;
{
sta->bottom=(element*)malloc(sizeof(element));
if(sta->bottom==NULL)
{
return OVERflow;
}
sta->bottom->next=NULL;
sta->top=sta->bottom;
return OK;
}
int push_stack(link_stack *sta,int e)//入栈;
{
sta->top->data=e;
element *p=(element *)malloc(sizeof(element));
if(p==NULL)
{
return OVERflow;
}
p->next=NULL;
sta->top->next=p;
sta->top=p;//注意点:栈顶指针为栈顶元素的位置+1(物理意义上的+1,地址并不连续);
return OK;
}
int pop_stack(link_stack *sta)//出栈;
{
if(sta->top==sta->bottom)
{
return Error;
}
element *p=sta->bottom;
while(p->next!=sta->top)
{
p=p->next;
}
element *q=sta->top;
sta->top=p;
sta->top->next=NULL;
free(q);
return OK;
}
int destroy_stack(link_stack *sta)//摧毁栈;
{
element *p;
element *q;
p=sta->bottom;//从底开始清空栈;
while(p!=NULL)
{
q=p->next;
free(p);
p=q;
}
sta->bottom=NULL;
return OK;
}
int get_length(link_stack sta)//获得栈长;
{
element *p=sta.bottom;
int l=0;
while(p!=sta.top)
{
p=p->next;
l++;
}
return l;
}
void get_element(link_stack sta)//遍历栈内所有元素;
{
element *p=sta.bottom;
while(p!=sta.top)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
bool is_empty(link_stack sta)//判断栈是否为空;
{
return sta.top==sta.bottom? true: false;
}
int main()
{
link_stack sta;
printf("初始化空栈:\n");
init_stack(&sta);
printf("栈是否为空?(1.是;0.否)\n");
printf("%d\n",is_empty(sta));
printf("栈内元素数:\n");
printf("%d\n\n",get_length(sta));
printf("元素1入栈:\n");
push_stack(&sta,1);
printf("栈是否为空?(1.是;0.否)\n");
printf("%d\n",is_empty(sta));
printf("栈内元素为:\n");
get_element(sta);
printf("栈内元素数:\n");
printf("%d\n\n",get_length(sta));
printf("元素2入栈:\n");
push_stack(&sta,2);
printf("栈是否为空?(1.是;0.否)\n");
printf("%d\n",is_empty(sta));
printf("栈内元素为:\n");
get_element(sta);
printf("栈内元素数:\n");
printf("%d\n\n",get_length(sta));
printf("元素3入栈:\n");
push_stack(&sta,3);
printf("栈是否为空?(1.是;0.否)\n");
printf("%d\n",is_empty(sta));
printf("栈内元素为:\n");
get_element(sta);
printf("栈内元素数:\n");
printf("%d\n\n",get_length(sta));
printf("栈顶元素出栈:\n");
pop_stack(&sta);
printf("栈是否为空?(1.是;0.否)\n");
printf("%d\n",is_empty(sta));
printf("栈内元素为:\n");
get_element(sta);
printf("栈内元素数:\n");
printf("%d\n\n",get_length(sta));
return 0;
}