从零开始学C++之数据封装与抽象:分别用C和C++来实现一个链栈
来源:互联网 发布:万网查询域名备案号 编辑:程序博客网 时间:2024/06/04 01:25
转:http://blog.csdn.net/jnu_simba/article/details/9284587
下面通过分别用C和C++来实现一个链栈(链表实现),从中体会数据封装抽象的思想:
C语言实现:
C++ Code
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
struct Link
{
int data;
struct Link *next;
};
struct Stack
{
struct Link *head;
int size;
};
void StackInit(struct Stack *stack)
{
stack->head = NULL;
stack->size = 0;
}
void StackPush(struct Stack *stack, const int data)
{
struct Link *node;
node = (struct Link *)malloc(sizeof(struct Link));
assert(node != NULL);
node->data = data;
node->next = stack->head;
stack->head = node;
++stack->size;
}
int StackEmpty(struct Stack *stack)
{
return (stack->size == 0);
}
int StackPop(struct Stack *stack, int *data)
{
if (StackEmpty(stack))
{
return 0;
}
struct Link *tmp = stack->head;
*data = stack->head->data;
stack->head = stack->head->next;
free(tmp);
--stack->size;
return 1;
}
void StackCleanup(struct Stack *stack)
{
struct Link *tmp;
while (stack->head)
{
tmp = stack->head;
stack->head = stack->head->next;
free(tmp);
}
stack->size = 0;
}
int main(void)
{
struct Stack stack;
StackInit(&stack);
int i;
for (i = 0; i < 5; i++)
{
StackPush(&stack, i);
}
while (!StackEmpty(&stack))
{
StackPop(&stack, &i);
printf("%d ", i);
}
printf("\n");
return 0;
}
#include <stdlib.h>
#include <assert.h>
struct Link
{
int data;
struct Link *next;
};
struct Stack
{
struct Link *head;
int size;
};
void StackInit(struct Stack *stack)
{
stack->head = NULL;
stack->size = 0;
}
void StackPush(struct Stack *stack, const int data)
{
struct Link *node;
node = (struct Link *)malloc(sizeof(struct Link));
assert(node != NULL);
node->data = data;
node->next = stack->head;
stack->head = node;
++stack->size;
}
int StackEmpty(struct Stack *stack)
{
return (stack->size == 0);
}
int StackPop(struct Stack *stack, int *data)
{
if (StackEmpty(stack))
{
return 0;
}
struct Link *tmp = stack->head;
*data = stack->head->data;
stack->head = stack->head->next;
free(tmp);
--stack->size;
return 1;
}
void StackCleanup(struct Stack *stack)
{
struct Link *tmp;
while (stack->head)
{
tmp = stack->head;
stack->head = stack->head->next;
free(tmp);
}
stack->size = 0;
}
int main(void)
{
struct Stack stack;
StackInit(&stack);
int i;
for (i = 0; i < 5; i++)
{
StackPush(&stack, i);
}
while (!StackEmpty(&stack))
{
StackPop(&stack, &i);
printf("%d ", i);
}
printf("\n");
return 0;
}
C++实现:
C++ Code
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include <iostream>
using namespace std;
class Stack
{
private:
struct Link
{
int data_;
Link *next_;
Link(int data, Link *next) : data_(data), next_(next)
{
}
};
public:
Stack() : head_(0), size_(0)
{
}
~Stack()
{
Link *tmp;
while (head_)
{
tmp = head_;
head_ = head_->next_;
delete tmp;
}
}
void Push(const int data)
{
Link *node = new Link(data, head_);
head_ = node;
++size_;
}
bool Empty()
{
return (size_ == 0);
}
bool Pop(int &data)
{
if (Empty())
{
return false;
}
Link *tmp = head_;
data = head_->data_;
head_ = head_->next_;
delete tmp;
--size_;
return true;
}
private:
Link *head_;
int size_;
};
// 避免名称冲突
// 类型的扩充
// 数据封装、能够保护内部的数据结构不遭受外界破坏
int main(void)
{
Stack stack; // 抽象数据类型 类类型
int i;
for (i = 0; i < 5; i++)
{
stack.Push(i); // this = &stack
}
while (!stack.Empty())
{
stack.Pop(i);
cout << i << " ";
}
cout << endl;
return 0;
}
using namespace std;
class Stack
{
private:
struct Link
{
int data_;
Link *next_;
Link(int data, Link *next) : data_(data), next_(next)
{
}
};
public:
Stack() : head_(0), size_(0)
{
}
~Stack()
{
Link *tmp;
while (head_)
{
tmp = head_;
head_ = head_->next_;
delete tmp;
}
}
void Push(const int data)
{
Link *node = new Link(data, head_);
head_ = node;
++size_;
}
bool Empty()
{
return (size_ == 0);
}
bool Pop(int &data)
{
if (Empty())
{
return false;
}
Link *tmp = head_;
data = head_->data_;
head_ = head_->next_;
delete tmp;
--size_;
return true;
}
private:
Link *head_;
int size_;
};
// 避免名称冲突
// 类型的扩充
// 数据封装、能够保护内部的数据结构不遭受外界破坏
int main(void)
{
Stack stack; // 抽象数据类型 类类型
int i;
for (i = 0; i < 5; i++)
{
stack.Push(i); // this = &stack
}
while (!stack.Empty())
{
stack.Pop(i);
cout << i << " ";
}
cout << endl;
return 0;
}
输出都是一致的,对比不同的写法,可以体会两种语言的一些不同之处,当然这只是比较显而易见的方面了。
参考:
C++ primer 第四版
Effective C++ 3rd
C++编程规范
0 0
- 从零开始学C++之数据封装与抽象:分别用C和C++来实现一个链栈
- 从零开始学C++之数据封装与抽象:分别用C和C++来实现一个链栈
- 再学C++,从零开始
- 『C/C++』一个用C/C++分别实现接口与实现相分离的设计原则的例子
- 分别用数组和链表实现堆栈(C语言版)
- 分别用C和C++实现了链表结构
- 如何用C设计和实现抽象数据类型(封装)
- 分别用C语言和Java来写九九乘法表
- 用C语言封装数据与方法
- 用C语言封装数据与方法
- 用C语言封装数据与方法
- 二叉排序树(C与Python分别实现)
- [讨论]一个关屏程序分别用c#.net cf 和 evc++实现的不同
- 如何分别用php和c实现一个简单的hashtable
- 从零开始学c语言教程
- 用c和c++分别实现ASCII String to integers
- 快速排序-c++(分别用数组和容器实现)
- 分别用Eigen和C++(OpenCV)实现图像(矩阵)转置
- POJ 2527 : Polynomial Remains - 多项式除法
- 从零开始学C++之对象的使用(三):static 与单例模式、auto_ptr与单例模式、const 用法小结、mutable修饰符
- 在iPhone上执行后台任务
- vijos1112小胖的奇偶(并查集,区间转两端线段)
- fragment动态加载
- 从零开始学C++之数据封装与抽象:分别用C和C++来实现一个链栈
- 观察者模式
- c++智能指针
- 从零开始学C++之友元:友元函数和友元类
- Sublime Text,Latex和Skim on Mac(支持中文)
- 航班管家向怡宁:如何做APP界面设计
- 从零开始学C++之运算符重载(一):以成员函数方式重载、以友元函数方式重载
- symfony2 入门一瞥
- JNI 之 Eclipse配置NDK