转自:http://blog.csdn.net/youlezhe/article/details/50564677?locationNum=2&fps=1
- /* 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);
- }
- else
- printf("查找失败!\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;
- }
- else
- printf("内存申请失败,缓冲区将清空!\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;
- }
- }