C语言面向对象——堆栈的链式存储

来源:互联网 发布:简易三维画图软件 编辑:程序博客网 时间:2024/05/19 03:46

使用函数指针,把函数的调用封装为对象方法。


//stack.h

#ifndef _STACK_H_#define _STACK_H_#include <stdio.h>#include <stdlib.h>typedef struct _node Node;typedef struct _stack Stack;void StackInit(Stack*);Node* StackPush(Stack*, int);void StackPop(Stack*);void StackPrint(Stack*);struct _node {int value;Node* next;};struct _stack {Node* Head;Node*(*Push)(Stack*, int);void(*Pop)(Stack*);void(*Print)(Stack*);};#endif


//stack.c

#include "stack.h"void StackInit(Stack* s)    //初始化{s->Head = NULL;s->Push = StackPush;s->Pop = StackPop;s->Print = StackPrint;}Node* StackPush(Stack* s, int n)    //入栈{printf("Push %d:\n", n);Node* node = (Node*)malloc(sizeof(Node));node->value = n;if (NULL == s->Head)    //链表空{node->next = NULL;}else{node->next = s->Head;}s->Head = node;return s->Head;}void StackPop(Stack* s)    //出栈{printf("Pop:\n");if (NULL == s->Head){printf("Stack in empty.\n");}else{Node* t = s->Head;s->Head = t->next;free(t);}}void StackPrint(Stack* s)    //输出{Node* t;printf("Head ->");for (t = s->Head; t; t = t->next){printf(" %d ->", t->value);}printf(" NULL\n");}


//main.c

#include "stack.h"int main(){Stack stack;  //创建一个Stack类的stack对象 StackInit(&stack);//入栈int n;do {printf("\nPush n:(input -1 to stop)\n");scanf_s("%d", &n);if (-1 != n){stack.Push(&stack, n);stack.Print(&stack);}} while (-1 != n);char c;c = getchar();  //读取缓冲区中多余的\n//出栈do {printf("\nPop:(input 1 to stop)\n");scanf_s("%c", &c);if ('1' != c){stack.Pop(&stack);stack.Print(&stack);}} while ('1' != c);c = getchar();return 0;}






0 0
原创粉丝点击