// 2013-11-5
//鏈表靜態棧
/*
*在一個棧結構體中設置兩個節點指針,分別指向棧頂和棧底
*節點是按需要新增的,所以這個棧理論上是可以很大的,與windows系統自動分配的棧有所不同
*首先要初始化棧,就是將棧頂和棧底都指向一個新造的節點,這個節點始終都存在,相當於鏈表中的頭結點,
*這個節點不放任何數據元素,只是用來管理棧的
*/
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <windows.h>
typedef struct node
{
int data;
struct node * pNext;
}NODE, *PNODE;
typedef struct stack
{
PNODE top;
PNODE bottom;
}STACK, *PSTACK;
void init(PSTACK pS);
void push(PSTACK pS, int);
bool pop(PSTACK pS, int *);
bool isempty(PSTACK pS);
void clear(PSTACK pS);
void traverse(PSTACK pS);
int main(void)
{
int val;
STACK s;
init(&s);
push(&s, 8);
push(&s, 4);
traverse(&s);
if (pop(&s, &val))
{
printf("彈出成功,彈出的元素爲:%d\n", val);
}
traverse(&s);
clear(&s);
traverse(&s);
return 0;
}
void init(PSTACK pS)
{
pS->top = (PNODE)malloc(sizeof(NODE));
if ( NULL == pS->top)
{
printf("內存分配失敗!!\n");
exit(-1);
}
else
{
pS->bottom = pS->top;
pS->top->pNext = NULL;
}
}
void push(PSTACK pS, int val)
{
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if (NULL == pNew)
{
printf("分配內存失敗!!\n");
exit(-1);
}
pNew->data = val;
pNew->pNext = pS->top;
pS->top = pNew;
}
bool pop(PSTACK pS, int *pVal)
{
if (isempty(pS))
{
printf("棧已經爲空了!!\n");
return false;
}
else
{
PNODE p = pS->top;
*pVal = p->data;
pS->top = p->pNext;
free(p);
p = NULL;
return true;
}
};
void traverse(PSTACK pS)
{
if (isempty(pS))
{
printf("空棧,沒有元素!!不能輸出~~~~~~~~~~\n");
return;
}
else
{
PNODE p = pS->top;
while (p != pS->bottom)
{
printf("%d ",p->data);
p = p->pNext;
}
printf("\n");
return;
}
}
bool isempty(PSTACK pS)
{
if (pS->top == pS->bottom)
{
return true;
}
else return false;
}
void clear(PSTACK pS)
{
PNODE p = pS->top;
while (p != pS->bottom)
{
PNODE q = p->pNext;
free(p);
p = q;
}
pS->top = p;
}
結果顯示爲:鏈表棧(動態分配管理)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.