您的位置:首页 > 理论基础 > 数据结构算法

栈的链式结构实现

2016-01-22 22:26 288 查看
/* 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;
}
}

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息