清华《数据结构》3.2.3
栈的链式表示:
#include <stdlib.h>
#include <stdlib.h>
#include <stdbool.h>
typedef char ElemType;
typedef struct Node
{
ElemType data;
struct Node *pNext;
} NODE, *PNODE;
typedef struct Stack
{
PNODE pTop;
PNODE pBottom;
} STACK, *PSTACK;
PSTACK creat_stack()
{
PSTACK pStack = (PSTACK)malloc(sizeof(STACK));
pStack->pBottom = (PNODE)malloc(sizeof(NODE));
if(pStack->pBottom == NULL || pStack == NULL)
{
printf("malloc failed");
exit(-1);
}
pStack->pTop = pStack->pBottom;
return pStack;
}
bool is_empty(PSTACK pStack)
{
bool result = false;
if(pStack->pBottom == pStack->pTop)
{
result = true;
}
else
{
result = false;
}
return result;
}
void push(PSTACK pStack, ElemType a)
{
PNODE pNode = (PNODE)malloc(sizeof(NODE));
if(pNode == NULL)
{
exit(-1);
}
pNode->data = a;
pNode->pNext = pStack->pTop;
pStack->pTop =pNode;
}
bool pop(PSTACK pStack, ElemType* pData)
{
if(is_empty(pStack))
{
return false;
}
else
{
PNODE p = pStack->pTop;
*pData = p->data;
pStack->pTop = p->pNext;
free(p);
p = NULL;
return true;
}
}
void traverse_stack(PSTACK pStack)
{
PNODE current = pStack->pTop;
printf("Now data in the stack are:\n");
while(current != pStack->pBottom)
{
printf("%c ", current->data);
current = current-> pNext;
}
printf("\n");
}
void clear_stack(PSTACK pStack)
{
//isEmpty()
PNODE p = NULL;
while(pStack->pTop != pStack->pBottom)
{
p = pStack->pTop;
pStack->pTop = p -> pNext;
free(p);
p = NULL;
}
}
main.c
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include "栈的链式表示.h"
// 建立输入缓冲区,只接受一行用户输入,然后把这行存入用户数据区
int main()
{
PSTACK pBufStack = creat_stack(); // 建立输入缓冲区
char input = 0;
while(input != '$')
{
do
{
scanf("%c", &input);
switch(input)
{
case '#':
pop(pBufStack, NULL);
break;
case '@':
clear_stack(pBufStack);
break;
default:
push(pBufStack, input);
break;
}
}
while(input != '\n' && input != '$');
//transfer(....); // 转移数据,每段数据先转移到一个中转栈中,中转栈再转到用户数据区,用户数据区是个队列。(中转栈只是暂时存放,每次都要清空)
}
getch();
return 0;
}