Chinaunix首页 | 论坛 | 博客
  • 博客访问: 140770
  • 博文数量: 12
  • 博客积分: 1411
  • 博客等级: 上尉
  • 技术积分: 433
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-25 14:25
文章分类

全部博文(12)

文章存档

2009年(3)

2008年(9)

我的朋友

分类: C/C++

2009-09-08 17:37:25

    接着上一篇《重温数据结构之单向链表》,这篇讲述数据结构里面的“栈”,用C语言实现对栈的操作。个例子是用单向链表实现栈的,当然也可以用其它方法来实现(如:数组)。
    下面是例子代码及其注释讲解,请有兴趣的朋友多提点建议。
 
 

/*
 * File : stack_test.c
 * Author : Nie Jun
 * Date : 2009/09/08
 * Mail : yhniejun@163.com
 */


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

////////////////////////////////////////////////////////////////////////////////

#define TRUE 1
#define FALSE 0

#define MAX_NAME_SIZE 64
////////////////////////////////////////////////////////////////////////////////

#pragma pack(1)
//定义栈结构体

typedef struct __StackNode_ StackNode;
struct __StackNode_
{
    StackNode *next; //指向下一个节点

    char Name[MAX_NAME_SIZE]; //数据

};
#pragma pack()
////////////////////////////////////////////////////////////////////////////////

//申请全局栈变量

StackNode *MyStack = NULL;
////////////////////////////////////////////////////////////////////////////////


//检查栈是否为空

int isEmpty(StackNode *pStack)
{
    return pStack->next == NULL;
}

/*
 * 向栈添加数据
 * data -- 需要添加的数据
 * pStack -- 需要操作的栈名
 */

int StackPush(char *data, StackNode *pStack)
{
    StackNode *tmpStack = NULL;

    if (!data || !pStack)
        return FALSE;

    tmpStack = (StackNode *)malloc(sizeof(StackNode));
    if (tmpStack == NULL)
        return FALSE;

    memcpy(tmpStack->Name, data, sizeof(tmpStack->Name));

    //从表头开始添加节点

    tmpStack->next = pStack->next;
    pStack->next = tmpStack;
    
    return TRUE;
    
} /* End of StackPush */


/*
 * 出栈操作函数
 * pStack -- 需要操作的栈名
 */

StackNode *StackPop(StackNode *pStack)
{
    StackNode *tmpStack = NULL;

    if ((!pStack) || isEmpty(pStack))
        return NULL;

    //取栈最顶部的节点

    tmpStack = pStack->next;

    pStack->next = pStack->next->next;

    return tmpStack;
        
} /* End of StackPop */

int main(int argc, char **argv)
{
    int i;
    char buffer[MAX_NAME_SIZE] = {0};

    //初始化栈

    MyStack = (StackNode *)malloc(sizeof(StackNode));
    if (MyStack == NULL)
    {
        printf("Malloc error\n");
        return -1;
    }
    memset(MyStack, 0, sizeof(StackNode));
    MyStack->next = NULL;

    if (isEmpty(MyStack))
        printf("This is an empty stack\n");

    //往栈里写入测试数据

    for (i=0; i<10; i++)
    {
        sprintf(buffer, "niejun_%d", i);
        StackPush(buffer, MyStack);
    }

    while (TRUE)
    {
        StackNode *pStack = NULL;

        printf("This is main thread\n");
        pStack = MyStack->next;
        //打印栈里的测试数据

        while (pStack)
        {
            if (pStack)
            {
                printf("Name [%s]\n", pStack->Name);
            }
            pStack = pStack->next;
        }

        pStack = NULL;
        //出栈操作

        pStack = StackPop(MyStack);

        if (pStack)
        {
            printf("Get a node name [%s]\n", pStack->Name);
            free(pStack);
            pStack = NULL;
        }
        
        sleep(1);
    }
    
    printf("Stack test\n");
    return 0;
}

阅读(627) | 评论(0) | 转发(0) |
0

上一篇:重温数据结构之单向链表

下一篇:没有了

给主人留下些什么吧!~~