1.栈的介绍
1.1线性结构的两种常见应用之一 栈 (存储数据的结构)
1.2栈和堆得区别:
堆:动态内存分配的(程序员手动来分配)
静态栈:静态内存分配的(操作系统分配)
#include<stdio.h>
#include<malloc.h>
int main()
{
int i;
int * q = (int *)malloc(200);//A aa=new A();aa相当于q,new A()相当于200的动态空间,java的底层是c++写的
return 0;
}
void fun()
{
int j;
int * p= (int *)malloc(200);
}//i,q,j,p都是栈分配的,而200都是堆分配的。动态栈就是只能在栈顶进行插入删除的链表,
2.定义
一种可以实现“先进后出” 的存储结构
栈类似于箱子
3.分类
静态栈 (类似于用数组实现)
动态栈 (类似于用链表实现)
4.链式栈的算法
主函数:
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct Node {
int data;
struct Node * pNext;
}NODE, *PNODE;
typedef struct Stack {
PNODE pTop; //指向栈顶元素,压栈就是初始化一个Node节点,栈顶指针后(上)移一个,
PNODE pButtom;//指向栈底元素的下一个元素,相当于头结点,方便操作
}STACK, *PSTACK;
void init(PSTACK pS);
void push(PSTACK pS, int val);
bool pop(PSTACK pS, int * pVal);
void traverse(PSTACK pS);
bool empty(PSTACK pS);
void clear(PSTACK pS);
int main()
{
STACK S;
int val;//保存删除的值
init(&S);
push(&S, 1);
push(&S, 2);
push(&S, 3);
push(&S, 4);
push(&S, 5);
traverse(&S);
clear(&S);
if (pop(&S, &val))
printf("出栈成功,出栈的值为%d\n", val);
else
printf("出栈失败!");
traverse(&S);
system("pause");
return 0;
}
4.0初始化:
void init(PSTACK pS)
{
pS->pTop = pS->pButtom = (PNODE)malloc(sizeof(NODE));
if (pS->pTop == NULL)
{
printf("内存分配失败!\n");
exit(-1);
}
pS->pTop->pNext = NULL;
}
4.2压栈(跟链表插入节点相同):
void push(PSTACK pS, int val)//由于不会出现满的问题,所以必定插入成功,不用返回为bool类型
{
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if (pNew == NULL)
{
printf("内存分配失败!\n");
exit(-1);
}
pNew->data = val;
pNew->pNext = pS->pTop;
pS->pTop = pNew;
return;
}
4.3遍历栈:
void traverse(PSTACK pS)//不可以因为遍历输出而去改变pS->pTop和pButtom的值,所以创建一个p来存放pTop的值
{
PNODE p = pS->pTop;
while (p != pS->pButtom)
{
printf("%d ,", p->data);
p = p->pNext;
}
printf("\n");
}
4.4出栈:
bool pop(PSTACK pS, int * pVal)//pS所指向的栈出栈一次,并把值赋给pVal,如果成功返回true失败就返回false
{
if (empty(pS))
return false;
else
{
PNODE p = pS->pTop;//用来删除用的
*pVal = p->data;
pS->pTop = pS->pTop->pNext;
free(p);//释放p所指向的节点的内存
p = NULL;//指针p指向空
return true;
}
}
4.4检查是否为空,清空栈:
bool empty(PSTACK pS)
{
if (pS->pTop == pS->pButtom)
return true;
else
return false;
}
void clear(PSTACK pS)//把栈变为init的形态
{
PNODE p = pS->pTop;
PNODE q = NULL;
while (p!=pS->pButtom)
{
q = p->pNext;
free(p);
p = q;
}
pS->pTop = pS->pButtom;
}
5.应用
函数调用:
中断
表达式求值(用两个栈,一个存放数字,一个存放符号)
内存分配
缓冲处理
迷宫