栈的C实现(stack)
rows="2" cols="20" id="ctl00_ctl00_cphContent_cphDoc_EntryEditor1_richTextEditor" class="mceEditor" style="height:450px;width:100%;">
栈是数据结构中最基础也是最经典的数据结构,无论在应用还是操作系统中均可以看到其身影。栈是一种特殊的
线性表,即限制在表的一端进行插入、删除运算。通常插入、删除的一端称为栈顶,另一端称为栈底,当栈中没
有数据时称为空栈。
栈中数据的插入和删除只在栈顶进行,所以栈中的数据总是后进先出(LIFO)。
栈上基本的运算有五种:
* SETNULL(s) 置栈s为空栈。
* EMPTY(s) 判断栈s是否为空。
* PUSH(s,x) 往栈s压入数据x。
* POP(s) 若栈s不为空,则弹出栈顶数据。
* TOP(s) 若栈s不为空,取栈顶数据。
下面,给出栈的最基本的实现代码:
#include <assert.h>
#define STACK_SIZE (1 << 6)
static stack_t stack[STACK_SIZE];
static int top = -1;
static int stack_full(void)
{
return (top == STACK_SIZE - 1);
}
static int stack_empty(void)
{
return (top == -1);
}
void stack_push(stack_t val)
{
assert(!stack_full());
stack[++top] = val;
}
stack_t stack_pop(void)
{
assert(!stack_empty());
--top;
return stack[top + 1];
}
stack_t stack_top(void)
{
assert(!stack_empty());
return stack[top];
}
从上面的实现代码可以看出,实现栈的基本操作的代码是非常简单的,不过二三十行的代码量。如果在实际的代
码开发中,根据应用的特定数据类型实现上述几个操作接口也是很容易的,但存在几个明显的缺陷:
* 代码不具备复用性。
* 采用静态数组存储,栈空间需在编译前确定。
* 不支持存储多种数据类型,需要修改stack_t定义。
为此,我们重新实现了如下的一套结构,来满足上面的这些复用性特征需求,代码如下:
#include <stdlib.h>
#include <string.h>
#include <assert.h>
struct _stack {
int top;
size_t len;
size_t size;
char *base;
};
typedef unsigned int hdl;
typedef struct _stack stack;
hdl stack_create(size_t size, size_t len)
{
stack *vp = (stack*)malloc(sizeof(stack));
if (vp == NULL) {
return 0;
}
assert(size > 0 && len > 0);
vp->base = (char*)malloc(size *
相关文档:
It is better to have the ability of fast learning
有一天你覺得甚麼都知道了 可悲
有一天你卻發現你甚麼都不會 加油吧
有一天你發現你又甚麼都會了 繼續
有一天你發現你甚麼都不會了 成功了
......
#include <stdlib.h>
#include<stdio.h>
#include<time.h>
#define randomize() srand((unsigned)time(NULL)) //定义一个宏
int main(void)
{
int i;
printf("Ten random numbers from 0 to 99\n\n");
randomize();
for(i=0; i<100; i++)
{
printf("%d\n", rand() % 100);
sleep(1) ......
为什么C语言依然如此流行?历史上,由于种种原因,业界选择了C,其中最主要的原因就在于它的效率。优秀的C程序的效率几乎和汇
编语言程序一样高,但C程序明显比汇编语言程序更易于开发。和许多其他语言相比,C给予程序员更多的控制权,如控制数据的存储位置和初始化过程等。C缺乏“安全网”特性,这虽有助于提高 ......
快速排序的核心在于分治.
分治算法:
1. 认定只有一个元素或没有元素的数组是有序的.
2. 将数组按照一个分界值分为左右两部分. 左面所有元素值比分界值小, 右面所有元素值比分界值大或等于.
3. 将左右两部分分别再分治, 直到要分支的部分只有一个元素或没有元素, 那么整个数组就是有序的了.
作者: selfimpr
博客: http ......