栈的C语言实现
队列的C语言实现
栈:后进先出 允许插入和删除的一端叫栈顶top 不允许的一端叫栈底bottom
主要操作:进栈、出栈、判断栈满和栈空
有两个现成的函数 int push(int s[],int x,int *ptop), int pop(int s[],int *py,int *ptop) 直接拿过来用就行 要压入的栈空间 要进栈的数 栈顶指针
队列:先进先出 允许插入的叫队尾rear 允许数据离开的叫队头front
主要操作:入队、出队、判断队满和队空
有两个现成的函数 int EnQueue(int *Q,int x,int *pf,int *pr) pf:队头指针
直接拿过来用就行 int DeQueue(int *Q,int *py,int *pf,int *pr) pr:队尾指针
Q:要进入的队空间 x:要进入队的数 py:要出队的数
(a) 线性队列
(b) 循环队列
队头:
front
队尾:
rear
队满条件:
(rear+1)%MAX=front
队空条件:
rear=front
入队:rear = (rear+1)%MAX
出队:front = (front+1)%MAX
习题答案
1、
//进栈算法
#include "stdio.h"
#define stacksize 100 /*定义stacksize为常数100 */
int push(int s[],int x,int *ptop)
{
int top;
top=*ptop; //ptop是指针变量;*ptop获得实际栈顶指针
if ( top==stacksize ) //栈满
{
printf("overflow\n");
return 0;
}
else
{
s[top]=x;
top++;
*ptop=top; //实际栈顶指针加1,返回到调用函数处
return 1;
}
}
int pop(int s[],int *py,int *ptop)
{
int top;
top=*ptop; //ptop是指针变量;*ptop获得实际栈顶指针
if (top==0) //栈空
{
printf("stack empty\n");
return 0;
}
else
{
--top;
*py=s[top]; //实际栈顶指针减1,返回到调用函数处
*ptop=top;
return 1;
}
}
int main()
{
static int s[stacksize];
int top=0,result,y;
int i;
result=push(s,11,&top); //将11压进栈中
result=push(s,22,&top); //将22压进栈中
result=push(s,33,&top); //将33压进栈中
printf("top=%d\n",top);
for (i=0;i<3;i++)
{
result=pop(s,&y,&top); //从栈中弹出
printf("top=%d,y=%d\n",top,y);
}
}
2、
//循环队列中加入一个元素的算法:
//设Q[MAX]表示循环队列
#define MAX 7
#include "stdio.h"
int EnQueue(int *Q,int x,int *pf,int *pr)
{
int front,rear;
front = *pf;
rear=*pr;
if ( (rear+1) % MAX == front ) //判断队满
return 0;
else
{
Q[rear]=x; //将数据存入队列
rear = ( rear+1 ) % MAX; //队尾指针移位
*pr=rear; //保存队尾指针
return 1;
}
}
int DeQueue(int *Q,int *py,int *pf,int *pr)
{
int front,rear;
front=*pf;
rear=*pr;
if (front==rear) //判断队空
return 0;
else
{
*py=Q[front]; //将数据读出
front=(front+1) % MAX; //队头指针移动
*pf=front; //保存队头指针
return 1;
}
}
int main()
{
static int s[MAX];
int rear = 0,front = 0;
int b=0;
EnQueue(s,11,&front,&rear); //入队操作
printf("front=%d,rear=%d\n",front,rear);
EnQueue(s,12,&front,&rear); //入队操作
printf("front=%d,rear=%d\n",front,rear);
EnQueue(s,13,&front,&rear); //入队操作
printf("front=%d,rear=%d\n",front,rear);
printf("***********\n");
DeQueue(s,&b,&front,&rear); //出队操作
printf("front=%d,rear=%d\n",front,rear);
printf("**%d**\n",b);
DeQueue(s,&b,&front,&rear); //出队操作
printf("front=%d,rear=%d\n",front,rear);
printf("**%d**\n",b);
DeQueue(s,&b,&front,&rear); //出队操作
printf("front=%d,rear=%d\n",front,rear);
printf("**%d**\n",b);
}