栈的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--];
}
小记
作为一种基本的数据结构,栈的实现还是挺简单的。
(全文完)
分享到:
相关推荐
该程序是我写的博客“一起talk C栗子吧(第十七回:C语言实例--栈二)”的配套程序,共享给大家使用
可运行C语言版本参考严蔚敏版本的数据结构与算法书,希望对正在学习的同学或者考研的同学有所帮助,我的代码都是在VC6.0上编写,编译。 #ifndef MAZE_H_ #define MAZE_H_ #include "stack.h" /** * position */ ...
栈的实现(C语言)数组实现以及链表实现源码,以及各个功能测试代码函数等 和后缀式转前缀式的用例
TCP/IP协议栈 ICMP协议实现C源代码
C语言实现ICMP协议 TCP/IP协议栈C语言实现ICMP协议 TCP/IP协议栈C语言实现ICMP协议 TCP/IP协议栈
栈的C语言实现,通过C语言实现常用数据结构栈;通过动手实现栈对学习数据结构以及C语言都有很大的帮助~
顺序栈的C语言实现,通过自己动手用C语言实现顺序栈,将对自己对数据结构的理解,以及C语言动手能力,都是一个很大的提高
用C实现的栈与队列,可以加载使用。详见博文http://blog.csdn.net/pirateleo/article/details/7574598 共包含5个文件
数据结构-栈的C语言实现,随手笔记
C语言实现栈实现表达式,很好用,有需要的请来下载。
数据结构中栈的C语言实现 数据结构中栈的C语言实现 数据结构中栈的C语言实现
动画演示--计算器运算过程中数据栈及符号栈中的数据变化。
基于栈的C语言迷宫问题与实现
栈的C语言实现,实现栈的基本压栈,出栈,遍历等功能
数据结构栈的c语言实现实例程序,供大家学习用。 关于栈的抽象数据类型,初始化,入栈,出栈,清空栈等操作!
用c语言来实现计算器功能,涉及到数据结构中的栈,和很好的逻辑思维、
自己用c语言来实现数据结构中的栈,详细的介绍了栈的结构
C语言 栈的实现,文章《也没想象中那么神秘的数据结构-后来居上的“栈”》系列示例代码
c语言:用栈实现迷宫求解 用栈实现迷宫求解c语言描述 很好的东西