棧是允許在同一端進行插入和刪除操作的特殊線性表。"先進後出" 像往箱子裏裝東西
允許進行插入和刪除操作的一端稱爲棧頂(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;
}
}