我觉得栈应该应用是很多的吧,不过现在说的栈只有基本的操作,知道她了解她。
栈就是一个先进后出的链表,我说的是链式栈哈。我觉得顺序栈应该叫压箱子,链式栈该叫码砖。因为顺序栈代表有固定的深度,链式栈随便多长。
入栈就是一个一个的压,每个节点指向刚刚她压住的那一个。我觉得就是初始化能够理解了,出入栈的操作很简单的。
我觉着越简单的数据结构就要越理解深一点(完全理解不知道该是啥程度),因为以后很多东西都是从这些结构里延伸出来的。
差不多贴结构体了:
typedef struct Node{
datatype data;//数据域
struct Node *pNext;//指针域
}Node, *pNode;
typedef struct Stack {
pNode Top;//栈顶
pNode Bottom;//栈底
}Stack,*pStack;
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef int datatype ;
typedef struct Node{
datatype data;//数据域
struct Node *pNext;//指针域
}Node, *pNode;
typedef struct Stack {
pNode Top;//栈顶
pNode Bottom;//栈底
}Stack,*pStack;
void Init(pStack ps);//初始化
bool isEmpty(pStack ps);//是否为空
void push(pStack ps, datatype item);//入栈
void Traverse(pStack ps);//遍历
bool pop(pStack ps,datatype *item);//出栈
//=======================================
//初始化
void Init(pStack ps) {
pNode pNew = (pNode )malloc(sizeof(Node));//创建新节点
if(!pNew)
exit(-1);
ps->Top = pNew ;//将新节点赋给顶和底
ps->Bottom = pNew;//最终的栈底是没有存数据的
ps->Top->pNext = NULL;//没数据 指向空
return ;
}//Init
//==========================================
//是否为空
bool isEmpty(pStack ps) {
if(ps->Top == ps->Bottom)
return true;
else
return false;
}//isEmpty
//==========================================
//入栈
void push(pStack ps, datatype item) {
pNode pNew = (pNode )malloc(sizeof(Node));
if(!pNew)
exit(-1);
pNew->data = item;//新节点
pNew->pNext = ps->Top ;//指向栈顶
ps->Top = pNew;//把新节点作为栈顶
return ;
}//push
//============================================
//遍历
/*
不能这样写
while(ps->Top != ps->Bottom) {
printf("%d ",ps->Top->data);
ps->Top = ps->Top->pNext;//遍历的目的在于输出节点值,这样等于间接清空栈
}
*/
void Traverse(pStack ps) {
pNode temp = ps->Top ;
while(temp != ps->Bottom ) {//未到栈底
printf("%d ",temp->data );//换datatype的时候%d记得改
temp = temp->pNext ;
}//while
return ;
}//Traverse
//==============================================
//出栈
void pop(pStack ps,datatype &item) {
if(isEmpty(ps)) {
printf("空栈!\n");
return ;
}
pNode temp = ps->Top ;
item = temp->data ;// 获取出栈的数据
ps->Top = temp->pNext ;//将栈顶的下一个节点作为栈顶
free(temp);//释放空间
temp = NULL ;
}//pop
//======================================
//测试程序
int main() {
Stack s;
int item;
Init(&s);
pop(&s,item);
push(&s,1);
push(&s, 2);
push(&s, 3);
push(&s, 4);
push(&s,5);
Traverse(&s);
printf("\n");
pop(&s,item);
printf("出栈的是%d \n",item);
while(!isEmpty(&s)) {
pop(&s,item);
printf("出栈的是%d \n",item);
}
Traverse(&s);
return 0;
}