前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >各种基本算法实现小结(二)—— 堆 栈

各种基本算法实现小结(二)—— 堆 栈

作者头像
阳光岛主
发布2019-02-20 16:36:28
6450
发布2019-02-20 16:36:28
举报
文章被收录于专栏:米扑专栏米扑专栏米扑专栏

各种基本算法实现小结(二)—— 堆 栈

(均已测试通过)

==============================================================

栈——数组实现

测试环境:Win - TC

#include <stdio.h>
char stack[512];
int top=0;
void push(char c)
{
    stack[top]=c;
    top++;
}
char pop()
{
    top--;
    return stack[top];
}
int is_empty()
{
    return 0==top;
}
void main()
{
    push('1');
    push('2');
    push('3');
    push('4');
    push('5');
    while(!is_empty())
        putchar(pop());
    putchar('/n');
    getch();
}

运行结果:

====================================================

栈——数组实现2

测试环境:Win - TC

#include <stdio.h>
#include <malloc.h>
/* typedef int DataType; */
#define DataType int
#define MAX 1024
typedef struct
{
    DataType data[MAX];
    int top;
}stack, *pstack;
pstack *init_stack()
{
    pstack ps;
    ps=(pstack)malloc(sizeof(stack));
    if(!ps)
    {
        printf("Error. fail malloc.../n");
        return NULL;
    }
    ps->top=-1;
    return ps;
}
int empty_stack(pstack ps)
{
    if(-1 == ps->top)
        return 1;
    else
        return 0;
}
int push(pstack ps, DataType data)
{
    if(ps->top == MAX-1)
    {
        printf("Stack is full.../n");
        return 0;
    }
    ps->top++;
    ps->data[ps->top]=data;
    return 1;
}
int pop(pstack ps, DataType *data)
{
    if(empty_stack(ps))
    {
        printf("Stack is empty.../n");
        return 0;
    }
    *data=ps->data[ps->top];
    ps->top--;
    return 1;
}
DataType top_stack(pstack ps)
{
    if(empty_stack(ps))
    {
        printf("Stack is empty.../n");
        return 0;
    }
    return ps->data[ps->top];
}
void display(pstack ps)
{
    int i;
    if(empty_stack(ps))
    {
        printf("Stack is empty.../n");
        return;
    }
    printf("printf the items of stack.../n");
    for(i=ps->top;i>-1;i--)
        printf("%4d", ps->data[i]);
    printf("/n/n");
}
void main()
{
    int i, num, data, *pdata;
    pstack ps;
    ps=init_stack();
    printf("Enter stack num:");
    scanf("%d", &num);
    for(i=0;i<num;i++)
    {
        scanf("%d", &data);
        push(ps, data);
    }
    display(ps);
    printf("Top is %d/n/n", top_stack(ps));
    for(i=0;i<num;i++)
    {
        pop(ps, pdata);
        printf("%3d", *pdata);
    }
    printf("/n/n");
    display(ps);
    getch();
}

运行结果:

====================================================

栈——链表实现

测试环境:Win - TC

#include <stdio.h>
#include <malloc.h>
typedef char DataType;
struct _node
{
    DataType data;
    struct _node *next;
};
typedef struct _node node, *pstack;
pstack init_stack()
{
    pstack ps;
    ps=(pstack)malloc(sizeof(node));
    if(NULL == ps)
    {
        printf("Error. malloc is fail.../n");
        return NULL;
    }
    ps->data=-1;  /* base of stack: data=-1 and next=NULL */
    ps->next=NULL;
    return ps;
}
pstack push(pstack ps, DataType data)
{
    pstack ptop;
    ptop=(pstack)malloc(sizeof(node));
    if(NULL == ptop)
    {
        printf("Error. malloc is fail.../n");
        return NULL;
    }
    ptop->data=data;
    ptop->next=ps;   /* insert new item */
    ps=ptop;         /* move top */
    return ps;
}
pstack pop(pstack ps, DataType *data)
{
    if(ps->next == NULL)
    {
        printf("stack is empty.../n");
        return NULL;            
    }
    *data=ps->data;
    ps=ps->next;
    return ps;
}
DataType top_stack(pstack ps)
{
    if(ps->next == NULL)  /* if empty */
    {
        printf("stack is empty.../n");
        return -1;
    }
    return ps->data;
}
int len_stack(pstack ps)
{
    int len=0;
    pstack ptop=ps;
    while(ptop->next)
    {
        len++;
        ptop=ptop->next;
    }
    return len;
}
void display(pstack ps)
{
    pstack ptop;
    ptop=ps;
    while(ptop->next != NULL)
    {
        printf("%4c", ptop->data);
        ptop=ptop->next;
    }
    printf("/n/n");
}
void main()
{
    pstack ps;
    DataType *data=(DataType *)malloc(sizeof(DataType));
    ps=init_stack();
    ps=push(ps, 'a');
    ps=push(ps, 'b');
    ps=push(ps, 'c');
    ps=push(ps, 'd');
    ps=push(ps, 'e');
    display(ps);
    printf("len of stack is: %d/n/n", len_stack(ps));
    printf("top of stack is: %c/n/n", top_stack(ps));
    ps=pop(ps, data);
    printf("pop %c/n",*data);
    display(ps);
    ps=pop(ps, data);
    printf("pop %c/n",*data);
    display(ps);
    getch();
}

运行结果:

========================================================

堆 ——链表实现

测试环境:Win - TC

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
struct _node
{
    int data;
    struct _node *next;
};
typedef struct _node node, *pnode;
struct _linkqueue
{
    pnode front;
    pnode rear;    
};
typedef struct _linkqueue linkqueue, *plinkqueue;
linkqueue init_queue()
{
    linkqueue lq;
    lq.front=lq.rear=(pnode)malloc(sizeof(node));
    if(NULL == lq.front)
    {
        printf("Error. malloc is fail.../n");
        exit(1);
    }
    lq.rear->data=lq.front->data=-1;
    lq.rear->next=lq.front->next=NULL;
    return lq;
}
int empty_queue(linkqueue lq)
{
    if(lq.front == lq.rear)
        return 1;
     else
        return 0;
}
linkqueue insert_item(linkqueue lq, int data)
{
    pnode pq;
    pq=(pnode)malloc(sizeof(node));
    if(pq == NULL)
    {
        printf("Error. malloc is fail.../n");
        exit(1);
    }
    pq->data=data;
    pq->next=lq.rear->next;
    lq.rear->next=pq;
    lq.rear=lq.rear->next;
    return lq;
}
linkqueue delete_item(linkqueue lq, int *data)
{
    if(empty_queue(lq))
    {
        printf("queue is empty.../n");
        exit(1);
    }
    *data=lq.front->data;
    lq.front=lq.front->next;
    return lq;
}
int len_queue(linkqueue lq)
{
    int len=0;
    while(lq.front)
    {
        len++;
        lq.front=lq.front->next;
    }
    return len;
}
void display(linkqueue lq)
{
    linkqueue p;
    p=lq;
    if(empty_queue(lq))
    {
        printf("queue is empty.../n");
        return;
    }
    while(p.front->next)
    {
        printf("%4d", p.front->data);
        p.front=p.front->next;
    }
    printf("%4d/n/n", p.front->data);
}
void main()
{
    int *data = (int *)malloc(sizeof(int));
    linkqueue lq;
    lq=init_queue();
    lq=insert_item(lq, 1);
    lq=insert_item(lq, 2);
    lq=insert_item(lq, 3);
    lq=insert_item(lq, 4);
    lq=insert_item(lq, 5);
    display(lq);
    printf("len of queue is: %d/n/n", len_queue(lq));
    lq=delete_item(lq, data);
    printf("delete %d/n", *data);
    display(lq);
    lq=delete_item(lq, data);
    printf("delete %d/n", *data);
    display(lq);
    getch();
}

运行结果:

参考推荐:

学习算法之路

各种基本算法实现小结(一)—— 链 表

各种基本算法实现小结(二)—— 堆 栈

各种基本算法实现小结(三)—— 树与二叉树

各种基本算法实现小结(四)—— 图及其遍历

各种基本算法实现小结(五)—— 排序算法

各种基本算法实现小结(六)—— 查找算法

各种基本算法实现小结(七)—— 常用算法

12个有趣的C语言面试题

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2010年06月03日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档