`
xitong
  • 浏览: 6188918 次
文章分类
社区版块
存档分类
最新评论

栈的C语言实现

 
阅读更多

栈的C语言实现

简述

栈是实现后进先出(FIFO)策略的一种基本数据结构。我们可以通过多种方式实现栈这种数据结构。

我们可以用下面的结构体来定义栈:

typedef struct stack {

inttop;

intkey[M];

} stack;

栈的一个属性s.top指向最新插入的元素。栈的另外一个属性s.key[]存放的是元素的关键字,包含的元素为s.key[1…s.top],其中s.key[1]是栈底元素,s.key[s.top]是栈顶元素。当s.top = 0时,栈空。

代码实现

下面程序省略了对上溢和下溢的检查。main()函数中的语句主要是栈的初始化和测试。

数组实现

最简单的方法也许就是数组了,不用考虑参数传递问题。

源代码如下:

# include <stdio.h>

# define M 100

int stackEmpty(int s[]);

void push(int s[], int x);

int pop(int s[]);

int main(void)

{

ints[M];

s[0]= 0;

printf("stackEmpty- %d\n", stackEmpty(s));

push(s,2);

push(s,5);

printf("stackEmpty- %d\n", stackEmpty(s));

printf("pop- %d\n", pop(s));

return0;

}

int stackEmpty(int s[])

{

if(s[0]== 0) {

return1;

}else {

return0;

}

}

void push(int s[], int x)

{

s[0]++;

s[s[0]]= x;

}

int pop(int s[])

{

if(s[0]== 0) {

return-1;

}else {

returns[s[0]--];

}

}

参数传值实现

注意:在参数传递的过程中使用的是地址

源代码如下:

# include <stdio.h>

# define M 100

typedef struct stack {

inttop;

intkey[M];

} stack;

int stackEmpty(stack s);

void push(stack * s, int x);

int pop(stack * s);

int main(void)

{

stacks;

s.top= 0;

/*测试代码 */

push(&s,2);

push(&s,3);

printf("pop- %d\n", pop(&s));

printf("stackEmpty- %d", stackEmpty(s));

}

int stackEmpty(stack s)

{

if(s.top== 0) {

return1;

}else {

return0;

}

}

void push(stack * sp, int x)

{

sp-> top += 1;

sp-> key[sp -> top] = x;

}

int pop(stack * sp)

{

if(sp-> top == 0) {

return-1;

}else {

sp-> top--;

returnsp -> key[sp -> top + 1];

}

}

引用实现

引用很好用,可惜C语言里没有。

源代码如下:

# include <stdio.h>

# define M 100

typedef struct stack {

inttop;

intkey[M];

} stack;

int stackEmpty(stack s);

void push(stack & s, int x);

int pop(stack & s);

int main(void)

{

stacks;

s.top= 0;

/*测试代码 */

push(s,2);

push(s,3);

printf("pop- %d\n", pop(s));

printf("stackEmpty- %d", stackEmpty(s));

}

int stackEmpty(stack s)

{

if(s.top== 0) {

return1;

}else {

return0;

}

}

void push(stack & s, int x)

{

s.top+= 1;

s.key[s.top]= x;

}

int pop(stack & s)

{

if(s.top== 0) {

return-1;

}else {

s.top--;

returns.key[s.top + 1];

}

}

全局变量实现

全局变量可以一直保存变量的值,不会因某个函数的结束而销毁,并且不用作为参数传递给函数。

源代码如下:

# include <stdio.h>

# define M 100

typedef struct stack {

inttop;

intkey[M];

} stack;

stack s;

int stackEmpty(void);

void push(int x);

int pop(void);

int main(void)

{

s.top= 0;

/*测试代码 */

push(2);

push(3);

printf("pop- %d\n", pop());

printf("stackEmpty- %d", stackEmpty());

}

int stackEmpty(void)

{

if(s.top== 0) {

return1;

}else {

return0;

}

}

void push(int x)

{

s.top+= 1;

s.key[s.top]= x;

}

int pop(void)

{

if(s.top== 0) {

return-1;

}else {

s.top--;

returns.key[s.top + 1];

}

}

另一种数组实现

第一种数组实现的时候使用s[0]表示s.top,如果定义一个新变量stop,可以让程序变得更加简单易读。

源代码如下:

# include <stdio.h>

# define M 100

int s[M];

int stop;

//stop = 0; //外部变量不能赋值吗??

int stackEmpty(void);

void push(int x);

int pop();

int main(void)

{

stop= 0;

printf("stackEmpty- %d\n", stackEmpty());

push(3);

printf("stackEmpty- %d\n", stackEmpty());

push(5);

//printf("pop- %d - %d\n", pop(), pop()); //这是一个未定义行为

printf("pop- %d\n", pop());

printf("pop- %d\n", pop());

printf("stackEmpty- %d\n", stackEmpty());

return0;

}

int stackEmpty(void)

{

if(stop== 0) {

return1;

}else {

return0;

}

}

void push(int x)

{

s[++stop]= x;

}

int pop(void)

{

returns[stop--];

}

小记

作为一种基本的数据结构,栈的实现还是挺简单的。

(全文完)

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics