栈和队列
2016-04-18 15:29
239 查看
栈的定义:一种特殊的线性表,可以分为链栈,顺序栈。
栈先进后出,以a1为栈底,an为栈顶(由于栈底元素是先进入的)
重点介绍顺序栈:
typedef struct Qnode
{
int data;
int *next;
}Qnode,*Qptr;
typedef struct
{
Qptr base;
Qptr top;
int size;
}Stack;
栈的创建:
bool InitStack(Stack &S)
{
S.base=(Qptr *) malloc (size*sizeof (Qptr) );
if(!S.base) return ERROR;
S.top=S.base;
S.size=MAX_SIZE;
return OK;
}//完成的主要是栈底指针的申请,以及栈的大小
栈的基本操作如压栈、出栈:
bool Push(Stack &S,int e)
{
if(S.top-S.base>=S.size)
{
S.base=(int *)realloc(S.base,(S.size+1)*sizeof(int));
if(!S.base) exit(0);
S.top=S.base+S.size;
S.size+=1;
}
++S.top=e;
return OK;
}
而出栈则是需要先判断是否为空栈,然后e=S.top--;
所以压栈时栈顶指针自加1,出栈时栈顶指针自减1.
队列则是一种先进先出的线性表。以a1表示队头,an表示队尾,队列从队尾插入元素,从队头删除元素,因此其插入删除操作为:
以链队列为例:
设在队尾插入节点的指针域为p,定义队列:
typedef struct Qnode
{
int data;
int *next;
}Qnode,*Qptr;
typedef struct
{
Qptr front;
Qptr rear;
}Queue;
InsertQueue(Queue &S,int e)
{
p=(Qptr)malloc(sizeof(Qnode));
if(!p) exit(0);
p->data=e; p->next=NULL;(即是p->next=Q.rear->next,因为后者就是NULL);
Q.rear->next=p;
//Q.rear=p,此处需要申明队列的尾部。
return OK;
}
DeleteQueue(Queue &S,int e)
{
if(Q.rear==Q.front) return ERROR;
p=Q.front->next;(说明位置)
e=p->data;
Q.front->next=p->next;(注意Q.front是p的前驱节点,p是队头指针,而Q.front是队头的前驱)
return OK;
}
而对于顺序队列(循环队列),其操作与顺序栈类似,在判空的时候不能以Q.front==Q.rear为条件,可以以Q.front->next==Q.rear作为判定。
栈先进后出,以a1为栈底,an为栈顶(由于栈底元素是先进入的)
重点介绍顺序栈:
typedef struct Qnode
{
int data;
int *next;
}Qnode,*Qptr;
typedef struct
{
Qptr base;
Qptr top;
int size;
}Stack;
栈的创建:
bool InitStack(Stack &S)
{
S.base=(Qptr *) malloc (size*sizeof (Qptr) );
if(!S.base) return ERROR;
S.top=S.base;
S.size=MAX_SIZE;
return OK;
}//完成的主要是栈底指针的申请,以及栈的大小
栈的基本操作如压栈、出栈:
bool Push(Stack &S,int e)
{
if(S.top-S.base>=S.size)
{
S.base=(int *)realloc(S.base,(S.size+1)*sizeof(int));
if(!S.base) exit(0);
S.top=S.base+S.size;
S.size+=1;
}
++S.top=e;
return OK;
}
而出栈则是需要先判断是否为空栈,然后e=S.top--;
所以压栈时栈顶指针自加1,出栈时栈顶指针自减1.
队列则是一种先进先出的线性表。以a1表示队头,an表示队尾,队列从队尾插入元素,从队头删除元素,因此其插入删除操作为:
以链队列为例:
设在队尾插入节点的指针域为p,定义队列:
typedef struct Qnode
{
int data;
int *next;
}Qnode,*Qptr;
typedef struct
{
Qptr front;
Qptr rear;
}Queue;
InsertQueue(Queue &S,int e)
{
p=(Qptr)malloc(sizeof(Qnode));
if(!p) exit(0);
p->data=e; p->next=NULL;(即是p->next=Q.rear->next,因为后者就是NULL);
Q.rear->next=p;
//Q.rear=p,此处需要申明队列的尾部。
return OK;
}
DeleteQueue(Queue &S,int e)
{
if(Q.rear==Q.front) return ERROR;
p=Q.front->next;(说明位置)
e=p->data;
Q.front->next=p->next;(注意Q.front是p的前驱节点,p是队头指针,而Q.front是队头的前驱)
return OK;
}
而对于顺序队列(循环队列),其操作与顺序栈类似,在判空的时候不能以Q.front==Q.rear为条件,可以以Q.front->next==Q.rear作为判定。
相关文章推荐
- 各种期望与概率
- 性能测试--Jmeter
- 匹配名称
- yii2中自定义验证规则rules
- 定制JOSSO 1.8.10 Gateway登录页面及与WildFly AS 10的集成
- 绘图工具
- JNCryptor在Android上的性能其差无比,而在iOS上RNCryptor则其强无比 何解?
- 六、归并排序
- vc获取程序本身的版本号
- Android 使用SimpleCursorAdapter为listview的item添加按钮
- OSG学习笔记0——解决OSG读obj模型问题
- [Regex]Get正则表达式
- iOS中根据网络环境显示不同图片
- 关于curl: (2) Failed Initialization
- node源码详解(六) —— 从server.listen 到事件循环
- Python BDD 学习资源
- 启动eclipse报错 jvm.dll问题
- 纯虚函数的使用汇总
- css3全屏背景图片切换特效
- CentOS安装vim