#include <stdio.h>
#include <malloc.h>
typedef int DataType; //自定义数据类型,假定为整型
struct Node; //单链表结点类型
typedef struct Node *PNode; //结点指针类型
typedef struct Node //单链表结点结构
{
DataType info; //结点数据域
PNode link; //结点指针域
}Node;
typedef struct LinkStack //链表栈定义
{
PNode top; //栈顶指针
}LinkStack;
typedef struct LinkStack * PLinkStack; //链表栈的指针类型
//创建一个的空栈
PLinkStack createEmptyStack(void)
{
PLinkStack stack=(PLinkStack)malloc(sizeof(struct LinkStack));
if(stack == NULL)
printf("存储分配失败,请重建栈!\n");
else
stack->top=NULL;
return stack;
}
//判断栈是否为空栈
int isEmptyStack(PLinkStack stack)
{
return (stack->top == NULL);
}
//进栈,成功返回1,失败返回0
int push(PLinkStack stack,DataType x)
{
PNode p =(PNode)malloc(sizeof(struct Node));
if(p == NULL )
{
printf("新结点分配内存失败,进栈失败,请重试!\n");
return 0;
}
else
{
p->info = x;
p->link=stack->top; //替换栈顶元素
stack->top=p;
return 1;
}
}
//出栈,成功返回1,失败返回0
int pop(PLinkStack stack)
{
if(isEmptyStack(stack))
{
printf("栈为空!\n");
return 0;
}
else
{
PNode p;
p=stack->top; //删除最后一个结点
stack->top = stack->top->link;
free(p);
return 1;
}
}
//取栈顶元素
DataType getTop(PLinkStack stack)
{
if(isEmptyStack(stack))
{
printf("栈为空!取栈顶元素失败!\n");
return NULL;
}
return (stack->top->info);
}
//显示栈内所有元素
void showStack(PLinkStack stack)
{
if(isEmptyStack(stack))
printf("当前栈为空!无内容可显示。\n");
else
{
PNode p;
p=stack->top;
printf("顶--> ");
while(p->link != NULL)
{
printf("%d ",p->info);
p=p->link;
}
printf("%d ",p->info); //显示最后一个元素
printf("-->底\n");
}
}
//把栈置空
void setEmpty(PLinkStack stack)
{
stack->top=NULL;
}
//把栈销毁
void destroyStack(PLinkStack stack)
{
if(stack)
{
stack->top=NULL;
free(stack);
}
}
int main( )
{
char input;
DataType data;
PLinkStack stack;
do
{
printf("---------------------------------------------\n");
printf("---------------------------------------------\n");
printf("---- 输入对应字符执行以下操作 ----\n");
printf("---- ----\n");
printf("---- \"0\":创建一个空栈 ----\n");
printf("---- \"1\":检查栈是否为空 ----\n");
printf("---- \"3\":执行入栈操作 ----\n");
printf("---- \"4\":执行出栈操作 ----\n");
printf("---- \"5\":打印栈顶元素 ----\n");
printf("---- \"6\":打印栈内所有元素 ----\n");
printf("---- \"7\":把栈清空 ----\n");
printf("---- \"8\":把栈销毁 ----\n");
printf("---- \"q\":退出程序 ----\n");
printf("---------------------------------------------\n");
printf("---------------------------------------------\n");
printf("选择操作:");
scanf("%c",&input);
switch(input)
{
case '0':
stack=createEmptyStack();
printf("成功创建链表栈。\n");
break;
case '1':
if(isEmptyStack(stack))
printf("该栈当前为空栈!\n");
else
printf("该栈当前不为空栈!\n");
break;
case '3':
fflush(stdin);
printf("请输入要入栈的值:");
scanf("%d",&data);
if( push(stack,data))
{
printf("入栈成功,栈当前内容:");
showStack(stack);
}
else
{
printf("入栈失败,请检查!\n");
}
break;
case '4':
if( pop(stack))
{
printf("出栈成功,栈当前内容:");
showStack(stack);
}
else
{
printf("出栈失败,请检查!\n");
}
break;
case '5':
data=getTop(stack);
printf("栈顶值为:%d\n",data);
break;
case '6':
printf("栈当前内容:");
showStack(stack);
break;
case '7':
setEmpty(stack);
printf("栈当前内容:");
showStack(stack);
break;
case '8':
destroyStack(stack);
printf("成功将栈销毁!\n");
break;
default:
break;
}
printf("\n");
fflush(stdin); /*清空缓冲区,也可以使用rewind(stdin);*/
}while( input != 'q' );
return 0;
}
链表实现栈
最新推荐文章于 2024-07-17 15:29:28 发布