#include<stdio.h>
#include<malloc.h>
/*
聲明結構體類型struct node,
包含數據域data和指針域next,屬於一個結點類型
*/
typedef struct node
{
int data;
struct node* next; //存放指向下一個結點的地址
}Node,*PNode;
/*
聲明一個結構體類型,包含棧頂和棧底元素,
Stack替換struct stack,PStack替換struct stack*
*/
typedef struct stack
{
PNode Top;
PNode Bottom;
}Stack,*PStack;
/*
聲明函數,初始化棧,進棧,出棧,輸出棧中元素函數
*/
void init_stack(PStack);
void push(PStack,int);
bool pop(PStack,int*);
void traverse_stack(PStack);
int main()
{
int val; //定義變量val,存放出棧的元素
Stack sta; //定義struct stack變量sta
init_stack(&sta); //初始化棧
push(&sta,1); //元素進棧
push(&sta,2);
push(&sta,3);
push(&sta,4);
push(&sta,5);
push(&sta,6);
putchar('\n');
traverse_stack(&sta); //遍歷棧中元素
putchar('\n');
if(pop(&sta,&val)) //出棧操作
{
printf("出棧的元素:%d\n",val);
putchar('\n');
traverse_stack(&sta);
}
return 0;
}
/*
初始化棧,傳入sta的地址,申請一塊struct node*類型的內存,
其指針域賦值為空,棧頂和棧底都指向這塊內存
*/
void init_stack(PStack psta)
{
psta->Bottom=(PNode)malloc(sizeof(Node)); //棧底指向申請的內存
psta->Top=psta->Bottom;
psta->Bottom->next=NULL; //設置PNode變量的指針域為空
return;
}
/*
元素進棧,傳入sta的地址和插入元素值,
先申請一塊類型為PNode內存,將其指針域賦值為棧頂元素,棧頂賦值為這塊內存的地址
*/
void push(PStack psta,int val)
{
PNode PNew=(PNode)malloc(sizeof(Node)); //定義struct node*類型的變量PNew指向一塊申請的內存
PNew->data=val; //將PNew的數據域賦值為val
PNew->next=psta->Top; //PNew的指針域賦值為棧頂元素
psta->Top=PNew; //棧頂元素指向PNew
printf("進棧元素:%d\n",val);
return;
}
/*
遍歷輸出棧中元素,傳入sta的地址,
先判斷棧是否為空,如果為空則不需要遍歷,
定義一個PNode變量p指向棧頂指向的內存,while遍歷棧中元素,知道p等於棧底的值
*/
void traverse_stack(PStack psta)
{
if(psta->Top==psta->Bottom) //判斷棧是否為空
{
printf("棧內沒有元素,怎麼遍歷!\n");
}
else
{
PNode p=psta->Top; //定義一個指向棧頂指向內存的struct node*變量p
printf("棧內元素遍歷:\n");
while(p!=psta->Bottom) //循環條件,p不等於棧底元素
{
printf("%d\t",p->data);
p=p->next; //p指向下一塊內存
}
printf("\n");
}
return;
}
/*
出棧,傳入sta的地址和val的地址,
先判斷棧是否為空,如果為空則不能進行出棧操作,
定義一個PNode變量p指向棧頂指向的內存,將棧頂元素賦值為下一個元素的地址,釋放p的內存
*/
bool pop(PStack psta,int* val)
{
if(psta->Top==psta->Bottom)
{
printf("棧內沒有元素,出不了棧的!\n");
return false;
}
else
{
PNode p=psta->Top; //定義一個指向棧頂指向內存的struct node*變量p
*val=p->data; //將p指向的數據域的值賦值給*val
psta->Top=p->next; //棧頂指向下一個元素
free(p); //釋放p指向的內存
return true;
}
}