接着上一篇《重温数据结构之单向链表》,这篇讲述数据结构里面的“栈”,用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) |