链式栈是用链表实现的栈的功能,理论上采用“头进头出”更加合理,看一个对有10个元素的链表操作。
//链式栈的程序实现:操作一个空间为10的链式栈 /*****头函数声明*****/ #include <stdio.h> #include <stdlib.h> /*****关键字声明*****/ typedef struct node { int data;//存数据 struct node * next;//存下一个结点的地址 }linkstack_t;//链式栈中结点的类型 /*****自定义函数声明*****/ linkstack_t * create_linkstack(); //1、创建栈 int isnull(linkstack_t * head); //2、判断栈空间是否为满 int push_linkstack(linkstack_t * head, int data); //3、入栈 int pop_linkstack(linkstack_t * head, int *data); //4、出栈 int get_linkstack_top(linkstack_t * head, int *data); //5、获取栈顶数据 int print_linkstack(linkstack_t * head); //6、打印数据 int clean_linkstack(linkstack_t * head); //7、清空 int dis_linkstack(linkstack_t * head); //8、销毁 /*****主函数*****/ int main(int argc, const char *argv[]) { linkstack_t * linkstack = create_linkstack(); if(linkstack == NULL) { printf("create_linkstack()执行出错\n"); return -1; } int i; for(i = 1; i <= 10; i++) push_linkstack(linkstack, i * 10);//调用入栈函数 print_linkstack(linkstack); int data; //获取出栈数据 for(i = 1; i <= 3; i++) { pop_linkstack(linkstack,&data); //调用出栈函数 printf("出栈数据:%d\n", data); //打印出栈数据 print_linkstack(linkstack); //调用打印函数 } int get_top_data; //获取栈顶数据 get_linkstack_top(linkstack, &get_top_data);//调用获取栈顶数据的函数 printf("get_top_data:%d\n", get_top_data);//打印栈顶数据 clean_linkstack(linkstack); //调用清空 print_linkstack(linkstack); dis_linkstack(linkstack); //调用销毁 return 0; } /*****函数内容*****/ linkstack_t * create_linkstack() //1、创建栈 { linkstack_t * head = malloc(sizeof(linkstack_t));//申请头结点的存储空间 if(head == NULL) { printf("空间申请失败!\n"); return NULL; } head->next = NULL; //对头地址初始化 return head; //返回申请空间的首地址 } int isnull(linkstack_t * head) //2、判断栈空间是否为满 { return head->next == NULL; } int push_linkstack(linkstack_t * head, int data)//3、入栈 { linkstack_t * newnode = malloc(sizeof(linkstack_t));//申请新结点的空间 newnode->data = data;//存入数据 newnode->next = head->next;//将新结点连入到链表中 head->next = newnode; return 0; } int pop_linkstack(linkstack_t * head, int *data)//4、出栈 { if(isnull(head))//判断实施条件 { printf("栈为空,无法执行出栈操作!\n"); return -1; } linkstack_t * temp = head->next;//备份出栈数据 head->next = temp->next; //删除出栈数据 *data = temp->data; //获取出栈数据 free(temp); //释放出栈数据的空间 return 0; } int get_linkstack_top(linkstack_t * head, int *data)//5、获取栈顶数据 { if(isnull(head)) { printf("栈为空,无法执行获取栈顶数据的操作!\n"); return -1; } *data = head->next->data;//获取栈顶数据 return 0; } int print_linkstack(linkstack_t * head)//6、打印数据 { if(isnull(head)) { printf("栈为空,无法执行打印操作!\n"); return -1; } printf("栈顶\n");//打印数据 while(head->next != NULL) { head = head->next; printf("%d\n",head->data); } printf("栈底\n"); return 0; } int clean_linkstack(linkstack_t * head) //7、清空 { int temp; while(!isnull(head))//只要栈不为空,就执行出栈数据的函数 { pop_linkstack(head, &temp); } return 0; } int dis_linkstack(linkstack_t * head) //8、销毁 { clean_linkstack(head);//调用清空 free(head); //释放头结点的空间 return 0; }