[C++学习笔记06]从一个实例看数据抽象与封装
简介:通过对比C语言和C++语言实现链式栈,看面向对象与面向过程的区别,比较简单,这里只是贴出代码。
C语言:
#include <stdio.h> #include <assert.h> #include <stdlib.h> struct Link { int data; struct Link *next; }; struct Stack { struct Link *head; int size; }; void initStack(struct Stack *stack) { stack->head = NULL; stack->size = 0; } int isEmptyStack(struct Stack *stack) { return (stack->size == 0); } void pushStack(struct Stack *stack, int data) { struct Link *tmp = NULL; tmp = (struct Link *)malloc(sizeof(struct Link)); //assert(tmp != NULL); tmp->data = data; tmp->next = stack->head; stack->head = tmp; ++stack->size; } void popStack(struct Stack *stack, int *data) { struct Link *tmp = NULL; if (isEmptyStack(stack)) return; tmp = stack->head; *data = stack->head->data; stack->head = stack->head->next; free(tmp); --stack->size; } void cleanupStack(struct Stack *stack) { struct Link *tmp = NULL; while (!isEmptyStack(stack)) { tmp = stack->head; stack->head = stack->head->next; free(tmp); } } int main(void) { int i; struct Stack stack; initStack(&stack); for (i = 0; i < 5; i++) pushStack(&stack, i); while (!isEmptyStack(&stack)) { popStack(&stack, &i); printf("%d ", i); } return 0; }
C++语言:
#include <iostream> using namespace std; class Stack { struct Link { int data_; Link *next_; }; public: Stack() : head_(NULL), size_(0) { } bool isEmpty() { return size_ == 0; } void push(int data) { Link *tmp = new Link; tmp->data_ = data; tmp->next_ = head_; head_ = tmp; ++size_; } void pop(int *data) { Link *tmp = NULL; if (isEmpty()) return; tmp = head_; *data = head_->data_; head_ = head_->next_; delete tmp; --size_; } ~Stack() { Link *tmp = NULL; while (!isEmpty()) { tmp = head_; head_ = head_->next_; delete tmp; --size_; } } private: Link *head_; int size_; }; int main(void) { Stack st; for (int i = 0; i < 5; i++) st.push(i); int data; while (!st.isEmpty()) { st.pop(&data); cout << data << " " << endl; } return 0; }