栈的链式结构实现

来源:互联网 发布:js 为空等于0简写 编辑:程序博客网 时间:2024/05/17 18:23
/* 2 栈的链式结构实现 */#include <stdio.h>#include <stdbool.h>#include <stdlib.h>typedef int TYPE;//元素类型别名//声明顺序栈结构体typedef struct stack{TYPE data;//存储结点数据struct stack* next;//记录后继结点的地址}stack;void init(stack**);//初始化void push(stack**,TYPE);//入栈TYPE pop(stack**);//出栈void clear(stack**);//清空bool isEmpty(stack*);//判断栈是否已满int length(stack*);//返回栈的元素个数void ergodic(stack*);//遍历栈中元素int search(stack*,TYPE);//搜索,返回具栈顶首次出现位置int main(){stack* top;init(&top);//入栈测试int count=0;//记录入栈元素个数printf("输入入栈元素个数:");scanf("%d",&count);int elem;//记录单个入栈元素printf("输入%d个元素:",count);while(count){scanf("%d",&elem);push(&top,elem);count--;}//遍历测试printf("遍历栈中元素:");ergodic(top);scanf("%*[^\n]");scanf("%*c");//搜索测试printf("输入要搜索的元素:");scanf("%d",&elem);int pos =search(top,elem);if(pos){printf("查找成功,%d在从栈顶开始第%d个元素\n",elem,pos);}elseprintf("查找失败!\n");//栈长度测试count = length(top);//栈清空测试  栈清空测试与出栈测试不能同时进行//clear(&top);//出栈测试printf("栈中有%d个元素\n",count);while(count--)printf("出栈元素是:%d\n",pop(&top));//栈长度测试printf("栈中有%d个元素\n",length(top));return 0;}//栈初始化//因为要更新栈顶指针本身的值,所以要用二级指针void init(stack** ss){*ss=NULL;}//入栈操作//因为要更新栈顶指针本身的值,所以要用二级指针void push(stack** ss,TYPE e){stack* p=(stack*)malloc(sizeof(struct stack));if(p){p->data = e;p->next=*ss;*ss=p;}elseprintf("内存申请失败,缓冲区将清空!\n");}//出栈操作//因为要更新栈顶指针本身的值,所以用二级指针TYPE pop(stack** ss){if(!isEmpty(*ss))//栈不为空{stack* q=*ss;//记录原来的栈顶指针int data=q->data;//获取栈顶元素值*ss=(*ss)->next;//更新栈顶指针free(q);//销毁原来栈顶元素q=NULL;return data;}}//判断是否为空bool isEmpty(stack* s){return s==NULL;}//返回栈的长度int length(stack* s){int count=0;while(s){s = s->next;count++;}return count;}//遍历栈void ergodic(stack* s){while(s){printf("%d ",s->data);s=s->next;}printf("\n");}//搜索栈中元素//返回元素距离栈顶的位置,如果有多个相同值,则返回首次出现的位置int search(stack* s,TYPE e){int pos=0;while(s){if(s->data==e){pos++;break;//找到就停止继续寻找}pos++;s=s->next;}return pos;}//清空栈//因为要更新栈顶指针本身的值,所以要用二级指针void clear(stack** ss){while(*ss){stack* q=*ss;*ss = (*ss)->next;free(q);q=NULL;}}

1 0