栈遵循先进后出的方式,实现如下:
#include <stdio.h>
#include<malloc.h>
//一个结构体代表栈的一个节点
typedef struct stack
{
int data;
struct stack *pNext;
}stack;
//栈顶指针和栈底指针
typedef struct point
{
stack *top;
stack *bottom;
}point;
void init(point *po); //初始化栈
int push(point *po, int val); //入栈
int pop(point *po, int *val); //出栈
void show(point *po); //显示所有元素
void clean(point *po);
void main()
{
int choose;
int val;
point po;
po.top = NULL;
po.bottom = NULL;
while(1)
{
printf("提供以下选项进行对栈的操作:\n");
printf("1. 初始化\n");
printf("2. 入栈\n");
printf("3. 出栈\n");
printf("4. 显示所有栈内元素\n");
printf("5. 清空\n");
printf("请输入要进行的操作(输入0退出): ");
scanf("%d", &choose);
switch(choose)
{
case 1:
init(&po);
printf("初始化成功!\n\n");
break;
case 2:
printf("请输入要入栈的元素: ");
scanf("%d", &val);
if(push(&po, val) == 1)
{
printf("入栈成功!\n\n");
}
break;
case 3:
if(pop(&po, &val) == 1)
{
printf("出栈成功, 出栈元素为:%d\n\n", val);
}
break;
case 4:
show(&po);
printf("\n\n");
break;
case 5:
clean(&po);
break;
default:
exit(-1);
}
}
}
//初始化
void init(point *po)
{
po->bottom = (stack*)malloc(sizeof(stack));
if(po->bottom == NULL)
{
printf("空间分配失败!");
exit(-1);
}
po->top = po->bottom;
po->bottom->pNext = NULL;
}
//入栈
int push(point *po, int val)
{
if(po->bottom == NULL)
{
printf("未初始化栈!\n\n");
return 0;
}
else
{
stack *sta = (stack*)malloc(sizeof(stack));
sta->data = val;
sta->pNext = po->top;
po->top = sta;
return 1;
}
}
//出栈
int pop(point *po, int *val)
{
if(po->top->pNext == NULL)
{
printf("栈内无元素!\n\n");
return 0;
}
else
{
stack *s = po->top;
*val = po->top->data;
po->top = po->top->pNext;
free(s);
return 1;
}
}
//显示所有元素
void show(point *po)
{
if(po->top->pNext == NULL)
{
printf("栈内无元素!");
}
else
{
stack *s = po->top;
while(s->pNext != NULL)
{
printf("%d ", s->data);
s = s->pNext;
}
}
}
void clean(point *po)
{
if(po->top->pNext == NULL)
{
printf("栈内无元素!\n\n");
return;
}
else
{
stack *s = po->top;
while(po->top->pNext != NULL)
{
po->top = po->top->pNext;
free(s);
s = po->top;
}
printf("清除成功!\n\n");
}
}