/* 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;
}
}