对于栈,我认为是跟链表差不多的东西。
贴出代码,写出了链表的初始化,压栈,出栈等函数。
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
//数据存放节点
typedef struct Node{
int data;
struct Node * pNext;
}NODE, *PNODE;
//节点的头指针,尾指针
typedef struct Stack{
PNODE pTop;
PNODE pBottom;
}STACK, *PSTACK;
//保证数据的类型和指针的类型相等
//函数声明
void init(PSTACK);//栈的建立
void push(PSTACK, int);//压栈函数
void pop(PSTACK);//出栈函数
void clear(PSTACK);
void traverse(PSTACK);//遍历输出
int main(){
STACK S;//定义栈S,相当于struct Stack S;
init(&S);//创建栈
//将数据压栈
push(&S, 1);
push(&S, 2);
pop(&S);
traverse(&S);
clear(&S);
traverse(&S);
return 0;
}
void init(PSTACK pS){
//动态分配一个数据存放的节点,pTop和pBottom初始指向的节点相同,所以只需要动态分配一片区域
pS->pTop = (PNODE)malloc(sizeof(NODE));
if(NULL == pS->pTop){
printf("动态分配失败\n");
exit(-1);
}
else{
pS->pBottom = pS->pTop;//尾指针和头指针指向同一区域
pS->pTop->pNext = NULL;//最底部的数据节点的pNext为NULL
}
}
void push(PSTACK pS, int val){
//定义一个新的节点
PNODE pNew = (PNODE)malloc(sizeof(NODE));
pNew->data = val;//新节点的数据域为val
pNew->pNext = pS->pTop;//新建立的节点指向原来的栈中的头节点
pS->pTop = pNew;//让Top指向新的头节点
}
//从栈顶开始,按照链表的规定进行输出
void traverse(PSTACK pS){
while(pS->pBottom != pS->pTop){
printf("%-5d", pS->pTop->data);
pS->pTop = pS->pTop->pNext;
}
printf("\n");
}
void pop(PSTACK pS){
if(pS->pTop == pS->pBottom){
printf("栈为空栈\n");
exit(-1);
}
else{
//定义一个新的PNODE数据是为了方便寻找出栈的节点来free
PNODE pNew;
pNew = pS->pTop;
pS->pTop = pS->pTop->pNext;
free(pNew);
pNew = NULL;
if(pS->pTop == pS->pBottom){
printf("栈为空栈\n");
}
}
}
void clear(PSTACK pS){
if(pS->pTop == pS->pBottom){
printf("栈为空栈\n");
exit(-1);
}
else{
PNODE p = pS->pTop;
PNODE q = NULL;
while(p != pS->pBottom){
q = p->pNext;
free(p);
p = q;
}
pS->pTop = pS->pBottom;
}
}