栈是允许在同一端进行插入和删除操作的特殊线性表。"先进后出" 像往箱子里装东西
允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);
栈底固定,而栈顶浮动;
栈中元素个数为零时称为空栈。
插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为后进先出表。
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include "MyStock.h"
int main()
{
MyStack stack1;
int Value;
InitStack(& stack1); //初始化栈
PushStack(& stack1, 1); //压栈
PushStack(& stack1, 2);
PushStack(& stack1, 22);
PopStack(& stack1, &Value);
Traverse(& stack1); //对栈进行遍历
ClearStack(& stack1);
printf("\n清空栈!\n");
Traverse(& stack1);
return 0;
}
/*
MyStock.h 头文件定义和声明
*/
#ifndef MYSTOCK_H_INCLUDED
#define MYSTOCK_H_INCLUDED
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct _element
{
int date;
struct Element * PNext;
}* PElement, Element;
typedef struct _mystack
{
PElement PTop;
PElement PBottom;
}* PMyStack, MyStack;
void InitStack(PMyStack); //生成一个栈 使PTop和PBottom指向同一个只用来存放地址的节点
bool PushStack(PMyStack, int);
void Traverse(PMyStack);
bool PopStack(PMyStack, int *);//出栈 并返回这个值
void ClearStack(PMyStack);//清空栈
bool EmptyStack(PMyStack);
#endif // MYSTOCK_H_INCLUDED
/*
MyStock.c 函数实现文件
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include "MyStock.h"
void InitStack(PMyStack PStack)//创建一个栈
{
PStack->PTop = (PElement)malloc(sizeof(Element));
if(NULL == PStack->PTop)
{
printf("\nPStack->PTop内存分配失败!\n");
exit(-1);
}
else
{
PStack->PBottom = PStack->PTop;//初始化的时候,PStack->PBottom = PStack->PTop共同指向一个空的区域
PStack->PBottom->PNext = NULL;
}
return;
}
bool PushStack(PMyStack PStack, int val)//压栈
{
PElement PNew = (PElement)malloc(sizeof(Element));//新建的一个栈的节点
PNew->date = val;
PNew->PNext = PStack->PTop;//栈的Top指向最上面一个节点
PStack->PTop = PNew;//说PTop指向最上面的节点,即PTop存储的是PNew的指针
return true;
}
/*------------------------错--------------------------
bool PushStack(PMyStack PStack, int val)//压栈
{
PElement PHead = (PElement)malloc(sizeof(Element));
PHead = NULL;
PElement PNew = (PElement)malloc(sizeof(Element));//新建的一个栈中节点
PNew->date = val;
PStack->PTop->PNext = PNew;
PNew->PNext = PHead;
PStack->PBottom->PNext = PHead;
return;
}
------------------------错---------------------------*/
void Traverse(PMyStack PStack)//遍历栈中的所有元素数据域
{
PElement PTem = PStack->PTop;
printf("\n");
while(PTem != PStack->PBottom)
{
printf("%d\t", PTem->date);
PTem = PTem->PNext;
}
return;
}
bool EmptyStack(PMyStack PStack)
{
if(PStack->PBottom == PStack->PTop){
return true;
}
return false;
}
bool PopStack(PMyStack PStack, int * Value)//出栈一次,并返回出栈的值
{
if(PStack->PBottom == PStack->PTop){
return false;
}
else
{
PElement PTem = PStack->PTop;
PStack->PTop = PStack->PTop->PNext;
printf("\n出栈的数是:%d\n", PTem->date);\
free(PTem);
return true;
}
}
void ClearStack(PMyStack PStack)//清空所有的元素
{
if(EmptyStack(PStack)){
return;
}
else
{
PElement PTem1 = PStack->PTop;//头指针
PElement PTem2 = NULL;//第一个节点的指针
while(PTem1 != PStack->PBottom)
{
PTem2 = PTem1->PNext;
free(PTem1);
PTem1 = PTem2;
}
PStack->PTop = PStack->PBottom;
return;
}
}