(栈具有先进后出的特点,只能在栈顶进行数据操作(入栈和出栈只能在栈顶进行))
1、本程序带有头结点
2、当有新结点入栈从头部插入数据
3、当需要删除结点时也从头部删除
结构体:
#include <stdio.h>
#include <windows.h>
typedef struct Stack
{
int val; //存储数据
struct Stack *Next; //指向下一结点
int nums; //元素数量
}Stack_Node;
栈的相关操作:
Stack_Node *InitStack(); //初始化链栈
void Push(Stack_Node *stack,int val); //入栈操作
int Pop(Stack_Node *stack); //出栈操作
boolean isEmpty(Stack_Node *stack); //判断栈是否为空
void show(Stack_Node *stack); //显示栈中数据元素
int GetNums(Stack_Node *stack); //获取栈中元素数量
主函数:
#include "stack.h"
void main()
{
Stack_Node *stack;
stack = InitStack();
int val ; //保存入栈数据
int opt = 1; //操作选择
while(opt)
{
printf("----------------------------------\n");
printf("1、入栈操作 2、出栈操作 \n");
printf("3、显示数据 4、获取元素数量\n");
printf("5、退出 \n");
printf("----------------------------------\n");
printf("请输入操作代号:");
scanf("%d",&opt);
switch(opt)
{
case 1:
printf("请输入入栈数据:\n");
scanf("%d",&val);
Push(stack,val);
break;
case 2:
printf("数据出栈:\n");
int data = Pop(stack);
printf("出栈数据为:\t%d\n",data);
break;
case 3:
printf("显示数据:\n");
show(stack);
break;
case 4:
printf("获取元素数量为:\n");
int num = GetNums(stack);
printf("元素数量为:\t%d\n",num);
break;
case 5:
printf("退出系统\n");
opt = 0;
exit(-1);
default:
printf("输入有误,请重新输入1~5之间的数字\n");
break ;
}
}
system("pause");
return ;
}
初始化链栈:
Stack_Node *InitStack()
{
Stack_Node *node = (Stack_Node *)malloc(sizeof(Stack_Node));
if(node == NULL)
{
printf("内存申请失败...\n");
exit(-1);
}
node->val = 0;
node->Next = NULL;
node->nums = 0;
return node;
}
入栈操作:
void Push(Stack_Node *stack,int val)
{
//采用头部入栈的方法
Stack_Node *tmp = (Stack_Node *)malloc(sizeof(Stack_Node)); //申请新的结点空间
if(tmp == NULL)
{
printf("内存申请失败");
return ;
}
tmp->val = val; //保存传入的数据
tmp->Next = stack->Next; //新结点指向头结点指向的下一元素
stack->Next = tmp; //头结点指向新结点
stack->nums ++; //元素数量加 1
}
出栈操作:
int Pop(Stack_Node *stack)
{
//判断栈中是否有结点存在
if(isEmpty(stack))
{
printf("栈为空\n");
return -1;
}
Stack_Node* delete = stack->Next; //辅助结点栈顶结点
int del_data = delete->val; //获取栈顶结点的数据
stack->Next = delete->Next; //头结点指向栈顶元素的下一结点
stack->nums --; //栈中元素数量减 1
free(delete); //释放结点空间
return del_data;
}
判断栈是否为空:
oolean isEmpty(Stack_Node *stack)
{
//栈中元素数量为 0 或者头结点指向为空时栈为空
if(stack->nums == 0 || stack->Next == NULL)
return TRUE;
return FALSE;
}
输出栈中数据:
void show(Stack_Node *stack)
{
Stack_Node *node = stack->Next;
while(node)
{
printf("栈中元素为:%d\t\n",node->val);
node = node->Next;
}
}
获取元素数量:
int GetNums(Stack_Node *stack)
{
return stack->nums;
}
说明:此文章为学习笔记,如有侵权联系删除。