Redian新闻
>
2012 CPRIT conference寻male室友
avatar
2012 CPRIT conference寻male室友# Biology - 生物学
r*o
1
【 以下文字转载自 InterviewHackers 俱乐部 】
发信人: roufoo (五经勤向窗前读), 信区: InterviewHackers
标 题: 用C设计Stack的interface,要求支持各种数据类型。
发信站: BBS 未名空间站 (Thu Oct 14 01:36:53 2010, 美东)
用C设计Stack的interface(push, pop, top, ...),要求支持各种数据类型。
C不支持template,那怎么设计比较好呢?
avatar
l*a
2
爱情本质就是一种特别特别纯净的东西,但随着年龄的增加,爱情的纯净度也会逐渐的
降低,这不是魔咒,这是谁也逃不掉的规律
当你多年以后,蓦然回首的刹那间,你心里最怀念的永远是你最初的爱情,而那段爱情
往往都是没有一个好的结果,当时的伤痛在当时来看,是无法抵御的伤心也是无法摆脱
的噩梦,多年后你再去触碰时,全然会变了另一种滋味,除了美好只有美好
爱情最早来得时候,现在看来都是我们不懂爱却自以为自己成熟的要命的年纪,幼稚永
远是在明天或者后天给自己的定义
二十岁刚刚出头的时候,也深深的爱过,如绝大多数人的初恋一样,开始的很美丽,结
束的没道理,那时候心里没有珍惜这个概念,也不知道爱一个人具体应该怎样,只是觉
得两个人在一起就是天下最美好的事,就像两个孩子过家家一样,在不懂得季节里故作
成熟的经营着以为就是一辈子的事
所有的分手都是疼痛的,至少在某一段时间内你需要去承受这个结果,初恋的终结时人
生在你心头扎下的第一把刀,多年后你会感谢这一刀的痕迹和疼痛,因为你在疼痛里长
大成熟,也最终在疼痛里知道了什么是最真最纯的爱,只是一切都会不去了。
今天在想起生命中的那个人,唯有感动和温暖。
avatar
Z*e
3
类似于象数码相机dpreview的
有专门分析的,好的图解的
或者有比较全的用户review的也行
avatar
z*t
4
Oct24-26, @ Austin,求room share
本人男,无不良嗜好,不喜party,作息规律。大家去开会落单的吱一声。悲催的实验
室去开会的就咱一个爷们啊
avatar
c*7
5
array,link list都可以吧。stack本身就可以当个数据类型来实现别的
avatar
r*o
7
那给个能支持各种数据类型的stack的interface定义吧。

【在 c*********7 的大作中提到】
: array,link list都可以吧。stack本身就可以当个数据类型来实现别的
avatar
c*l
8
gsmarena.com

【在 Z***e 的大作中提到】
: 类似于象数码相机dpreview的
: 有专门分析的,好的图解的
: 或者有比较全的用户review的也行

avatar
x*y
9
void *

【在 r****o 的大作中提到】
: 那给个能支持各种数据类型的stack的interface定义吧。
avatar
d*k
10
Phonedog,有compare
avatar
r*o
11
写个完整的吧。

【在 x***y 的大作中提到】
: void *
avatar
n*l
12

其实我觉得在这里站内搜搜就很实用了。

【在 Z***e 的大作中提到】
: 类似于象数码相机dpreview的
: 有专门分析的,好的图解的
: 或者有比较全的用户review的也行

avatar
p*7
13
我被问到过如何用C实现C++的这种类似的功能,面试官的答案其实就是给每个数据类型
都设计一个函
数,比如push_int push_float push_pointer push_double.....

【在 r****o 的大作中提到】
: 写个完整的吧。
avatar
s*y
14
cnet?

【在 Z***e 的大作中提到】
: 类似于象数码相机dpreview的
: 有专门分析的,好的图解的
: 或者有比较全的用户review的也行

avatar
y*e
15
/* create a stack
* returns NULL if failure to create.
*/
STACK* stack_create();
/* dispose a stack */
void stack_close(STACK* stack);
/* push the data into a stack. returns 0 if fail. */
int stack_push(STACK* stack, void* data);
/* pop the top item from the stack and store it into data.
returns 0 if fail. */
int stack_pop(STACK* stack, void** data);
/* get number of items in the stack */
int stack_size(STACK* stack);

【在 r****o 的大作中提到】
: 写个完整的吧。
avatar
r*o
17
stack_push(), stack_pop()这些函数里面具体怎么实现对不同数据类型的处理的呢?

【在 y*********e 的大作中提到】
: /* create a stack
: * returns NULL if failure to create.
: */
: STACK* stack_create();
: /* dispose a stack */
: void stack_close(STACK* stack);
: /* push the data into a stack. returns 0 if fail. */
: int stack_push(STACK* stack, void* data);
: /* pop the top item from the stack and store it into data.
: returns 0 if fail. */

avatar
t*h
19

要还需要数据的大小吧
比如
int stack_push(STACK* stack, void* data, int size);

【在 y*********e 的大作中提到】
: /* create a stack
: * returns NULL if failure to create.
: */
: STACK* stack_create();
: /* dispose a stack */
: void stack_close(STACK* stack);
: /* push the data into a stack. returns 0 if fail. */
: int stack_push(STACK* stack, void* data);
: /* pop the top item from the stack and store it into data.
: returns 0 if fail. */

avatar
t*h
20

比如
int stack_push(STACK* stack, void* data, int size)
size是你要push的数据类型的大小,就是在内存里用多长的地址来表示。
再举个例子 你想要push一个int 就是
stack_push(stack, data, sizeof(int));
这样就知道这个void* 按一个int的长度来处理
建议你去看看youtube里面stanford大学的教程 Programming Paradigms
没记错里面的前10讲就是讲这方面 讲的很详细

【在 r****o 的大作中提到】
: stack_push(), stack_pop()这些函数里面具体怎么实现对不同数据类型的处理的呢?
avatar
y*e
21
若是存储的是指针类型,那么就不需要大小。
比如如下的示例代码:
int a = 10;
float b = 3.0f;
stack_push(s, &a);
stack_push(s, &b);
void* 可以兼容所有的指针类型,比如 int*, float* 这些。而指针本身大小是固定的,
在32位机器上一般是32bit。所以不需要大小。
PS:若是需要大小的话,应该带入的参数类型是size_t而不是int

【在 t******h 的大作中提到】
:
: 比如
: int stack_push(STACK* stack, void* data, int size)
: size是你要push的数据类型的大小,就是在内存里用多长的地址来表示。
: 再举个例子 你想要push一个int 就是
: stack_push(stack, data, sizeof(int));
: 这样就知道这个void* 按一个int的长度来处理
: 建议你去看看youtube里面stanford大学的教程 Programming Paradigms
: 没记错里面的前10讲就是讲这方面 讲的很详细

avatar
d*e
22
我觉得需要知道大小吧。
因为需要将void * 转换出来。
比如地址 1234,但怎么知道它是char *,int *,还是double *

的,

【在 y*********e 的大作中提到】
: 若是存储的是指针类型,那么就不需要大小。
: 比如如下的示例代码:
: int a = 10;
: float b = 3.0f;
: stack_push(s, &a);
: stack_push(s, &b);
: void* 可以兼容所有的指针类型,比如 int*, float* 这些。而指针本身大小是固定的,
: 在32位机器上一般是32bit。所以不需要大小。
: PS:若是需要大小的话,应该带入的参数类型是size_t而不是int

avatar
y*e
23
stack_pop 的函数声明形式是 int stack_pop(STACK* stack, void** data);
输出是 void**,所以不需要知道大小。
avatar
l*y
24
你这样存的是指针,不是data。如果data在stack之外被free了或者被overwrite了,这
个stack存的指针就没用了。
真正的stack还是要存实际数据的吧。

的,

【在 y*********e 的大作中提到】
: 若是存储的是指针类型,那么就不需要大小。
: 比如如下的示例代码:
: int a = 10;
: float b = 3.0f;
: stack_push(s, &a);
: stack_push(s, &b);
: void* 可以兼容所有的指针类型,比如 int*, float* 这些。而指针本身大小是固定的,
: 在32位机器上一般是32bit。所以不需要大小。
: PS:若是需要大小的话,应该带入的参数类型是size_t而不是int

avatar
y*e
25
嗯,这个要看面试的时候沟通弄清楚要求了。
若是要存实实在在的data,那么大抵可以在stack_create的时候引入一个参数
,是为每一个元素的size。在push的时候,把数据拷贝到stack上。
typedef struct {
size_t count; /* no of elements in stack */
size_t capacity; /* max no of elements can be held */
size_t element_size; /* size of each element */
char* ptr;
} STACK;
/* Create a stack by specifying size of each element.
returns NULL if failure. */
STACK* stack_create(size_t element_size) {
STACK* s = malloc(sizeof(STACK));
if (!s) return NULL;
s->element_size = element_size;
s->count = 0;
s->capacity = DEFAULT_CAPACITY;
s->ptr = malloc(DEFAULT_CAPACITY * element_size);
if (!s->ptr) return NULL;
return s;
}
/* Push the data into stack by copying
returns 0 if failure. */
int stack_push(STACK* s, void* data) {
if (!ensure_capacity(s))
return FALSE;

size_t index = s->element_size * s->count;
memcpy(s->ptr[index], data, s->element_size);
++s->count;
return TRUE;
}
/* Pop the top element from the stack, and copy it into
data. Returns 0 if failure. */
int stack_pop(STACK* s, void* data) {
if (s->size == 0)
return FALSE;
size_t index = s->element_size * s->count;
memcpy(data, s->ptr[index], s->element_size);
--s->count;
return TRUE;
}

【在 l*******y 的大作中提到】
: 你这样存的是指针,不是data。如果data在stack之外被free了或者被overwrite了,这
: 个stack存的指针就没用了。
: 真正的stack还是要存实际数据的吧。
:
: 的,

avatar
b*n
26
the actual STACK can be a structure, size can be stored when stack is
created

【在 t******h 的大作中提到】
:
: 比如
: int stack_push(STACK* stack, void* data, int size)
: size是你要push的数据类型的大小,就是在内存里用多长的地址来表示。
: 再举个例子 你想要push一个int 就是
: stack_push(stack, data, sizeof(int));
: 这样就知道这个void* 按一个int的长度来处理
: 建议你去看看youtube里面stanford大学的教程 Programming Paradigms
: 没记错里面的前10讲就是讲这方面 讲的很详细

avatar
b*n
27
have you ever tested your code?

【在 y*********e 的大作中提到】
: stack_pop 的函数声明形式是 int stack_pop(STACK* stack, void** data);
: 输出是 void**,所以不需要知道大小。

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。