栈的C语言实现

来源:互联网 发布:网络运维在做什么 编辑:程序博客网 时间:2024/05/01 16:21
栈的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);
}
0 0