栈其实就是一种实现“先进后出”的一种存储结构。
用动态链表的方式实现出栈和压栈:
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <malloc.h>
#include <stdlib.h>
//节点的结构
typedef struct Node
{
int date;
struct Node *pNext;
}NODE, *PNODE;
{
int date;
struct Node *pNext;
}NODE, *PNODE;
//栈顶和栈底的指针
struct Stack
{
PNODE pTop;
PNODE pBottom;
}STACK, *PSTACK;
{
PNODE pTop;
PNODE pBottom;
}STACK, *PSTACK;
//先建造一个空的节点,让栈底和站顶相等,建造空的节点易于操作栈。
void initStack(PSTACK pS)
{
PNODE S = (PNODE)malloc(sizeof(NODE));
if(S == NULL)
{
printf("S malloc failed\n");
exit(-1);
}
pS->pTop = S;
pS->pBottom = S;
S->pNext = NULL;
}
{
PNODE S = (PNODE)malloc(sizeof(NODE));
if(S == NULL)
{
printf("S malloc failed\n");
exit(-1);
}
pS->pTop = S;
pS->pBottom = S;
S->pNext = NULL;
}
void pushStack(PSTACK pS, int date)
{
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if(pNew == NULL)
{
printf("pNew malloc failed\n");
exit(-1);
}
pNew->date = date;
pNew->pNext = pS->pTop;
pS->pTop = pNew;
{
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if(pNew == NULL)
{
printf("pNew malloc failed\n");
exit(-1);
}
pNew->date = date;
pNew->pNext = pS->pTop;
pS->pTop = pNew;
}
void traverseStack(PSTACK pS)
{
PNODE P;
P = pS->pTOP;
while(p != pS->pBottom)
{
printf("%d ",p->date);
p = p->pNext;
}
printf("\n");
return;
}
bool popStack(PSTACK pS, int *pVal)
{
if(pS->pTop == pS->pBottom)
{
printf("stack is emply\n");
return false;
}
PNODE r;
r = pS->pTop;
*pVal = r->date;
pS->pTop = r->pNext;
free(r);
r = NULL;
return true;
}
{
PNODE P;
P = pS->pTOP;
while(p != pS->pBottom)
{
printf("%d ",p->date);
p = p->pNext;
}
printf("\n");
return;
}
bool popStack(PSTACK pS, int *pVal)
{
if(pS->pTop == pS->pBottom)
{
printf("stack is emply\n");
return false;
}
PNODE r;
r = pS->pTop;
*pVal = r->date;
pS->pTop = r->pNext;
free(r);
r = NULL;
return true;
}
void clear(PSTACK pS)
{
if(pS->pTop == pS->pBottom)
{
printf("栈为空\n");
}
else
{
PNODE p = pS->pTop;
PNODE q = NULL;
while(p != pS->pBottom)
{
q = p->pNext;
free(p);
p = q;
}
pS->pTop = pS->pBottom;
}
}
{
if(pS->pTop == pS->pBottom)
{
printf("栈为空\n");
}
else
{
PNODE p = pS->pTop;
PNODE q = NULL;
while(p != pS->pBottom)
{
q = p->pNext;
free(p);
p = q;
}
pS->pTop = pS->pBottom;
}
}
int main(void)
{
STACK S; //STACK 等价于 struct Stack
int val;
bool ret;
initStack(&S); //目的是建造一个空栈
pushStack(&S, 1); //压栈
ret = popStack(&S, &val); //出栈元素
if(ret == false)
{
printf("栈为空\n");
}
else
{
printf("出栈元素是 %d \n", val);
}
traverseStack(&S); //遍历栈
clear(&pS); //清空栈
{
STACK S; //STACK 等价于 struct Stack
int val;
bool ret;
initStack(&S); //目的是建造一个空栈
pushStack(&S, 1); //压栈
ret = popStack(&S, &val); //出栈元素
if(ret == false)
{
printf("栈为空\n");
}
else
{
printf("出栈元素是 %d \n", val);
}
traverseStack(&S); //遍历栈
clear(&pS); //清空栈
}