栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

1.顺序栈

#include<stdio.h>
#include<stdlib.h> 
#define initSize 30
typedef int DataType;
typedef int SElemType;  
typedef struct {//顺序栈的动态存储结构
    SElemType *elem;  
    int maxsize, top;
}SeqStack;  
   
void InitStack(SeqStack &S) {//建立一个最大尺寸为initsize的空栈,若分配不成功则进行错误处理   
    S.elem=(SElemType*) malloc (initSize*sizeof(SElemType));//创建栈空间 
    if(S.elem==NULL) {
        printf("存储空间分配失败!\n");
        exit(1);
    }
    S.maxsize=initSize;
    S.top=-1; 
}  
   
int Push(SeqStack &S, DataType x) {//进栈操作, 若栈不满,则将元素 x 插入栈顶, 函数返回 1 ,否则栈溢出,函数返回 0;   
    if(S.top==S.maxsize-1) return 0;//栈满则溢出处理   
    S.elem[++S.top]=x;//栈顶指针先加 1 ,再进栈   
    return 1;
}  
   
int Pop(SeqStack &S, SElemType &x) {  
    //退栈; 若栈不空,则函数通过引用参数x 返回栈顶元素值,栈顶指针退 1, 函数指针返回 1;  
    if(S.top==-1) return 0;  
    x=S.elem[S.top--];  
    return 1;   
}  
   
int GetTop(SeqStack &S, SElemType &x) {  
    //读取栈顶元素的值:若栈不空则函数返回栈顶的值且函数返回 1, 否则函数返回 0  
    if(S.top==-1) return 0;  
    x=S.elem[S.top];  
    return 1;   
}  
   
int StackEmpty (SeqStack &S) {//函数测试栈S是否空,若栈空,函数返回 1, 否则返回 0   
    return S.top==-1;//函数返回S.top==-1 的结果   
}  
   
int StackFull(SeqStack &S) {//测试栈S 是否满 ,若栈满,函数返回 1, 否则返回 0  
    return S.top==S.maxsize;//此处为一逻辑表达式, 返回逻辑值的结果   
}  
   
int StackSize(SeqStack &S) {//函数返回栈 S 的长度,即,栈中元素的个数   
    return S.top+1;
}   
   
void Reverse(SElemType A[], int n) {//请空栈 
    SeqStack S;
    InitStack(S);
    int i;  
    for(i=1; i<=n; i++) Push(S, A[i-1]);       
    i=0;  
    while(!StackEmpty(S)) Pop(S, A[i++]);  
}

2.链式栈

<stdio.h>
#include<stdlib.h>
 
typedef int DataType;
typedef int SElemType;
typedef struct node {
	SElemType data;
	struct ndoe *link; 
}LinkNode, *LinkStack;
 
void InitStack(LinkStack &S) {
	S=NULL;
}
 
int Push(LinkStack &S, SElemType x) {//链式栈初始化;置顶栈指针,即链表头指针为空 
	LinkNode *p=(*LinkNode) malloc (sizeof(LinkNode));//创建新节点 
	p->data=x;
	p->link=S;
	S=p;//新节点插在链头 
	return 1;
}
 
int Pop(LinkStack &S, SElemType &x) {//退栈,若栈空,函数返回 0 ,参数值 X不可用 
	if(S==NULL) return 0;
	LinkNode *p=S;
	x=p->data;//存栈顶元素 
	S=p->link;
	free(p);//栈顶指针退到新栈顶位置 
	return 1;
}
 
int GetTop(LinkStack &S, SElemTye &x) {//读取栈顶,若栈不空,函数通过引用参数X 返回栈顶元素的值 
	if(S==NULL) return 0;//栈空,函数返回 0 
	x=S->data;
	return 1;
} 
 
int StackEmpty (LinkkStack &S) {//判断栈是否为空 
	return s==NULL;
}
 
int StackSize(LinkStack &S) {//求栈的长度,计算栈元素的个数 
	LinkNode *p=S;
	int k=0;
	while(p!=NULL) {//逐个节点计算 
		p=p->link;
		k++;
	}
	return k;
}

应用:

用顺序栈写头文件(软件:DEVc++)

#ifndef __STACK_H__
#define __STACK_H__
#include<stdio.h>
#include<stdlib.h> 
#define initSize 30
typedef int DataType;
typedef int SElemType;  
typedef struct {//顺序栈的动态存储结构
    SElemType *elem;  
    int maxsize, top;
}SeqStack;  
   
void InitStack(SeqStack &S) {//建立一个最大尺寸为initsize的空栈,若分配不成功则进行错误处理   
    S.elem=(SElemType*) malloc (initSize*sizeof(SElemType));//创建栈空间  
    if(S.elem==NULL) {  
        printf("存储空间分配失败!\n");  
        exit(1);  
    }
    S.maxsize=initSize;
    S.top=-1;  
}  
   
int Push (SeqStack &S, DataType x) {//进栈操作, 若栈不满,则将元素 x 插入栈顶, 函数返回 1 ,否则栈溢出,函数返回 0;   
    if(S.top==S.maxsize-1) return 0;//栈满则溢出处理   
    S.elem[++S.top]=x;//栈顶指针先加 1 ,再进栈   
    return 1;  
}  
   
int Pop(SeqStack &S, SElemType &x) {  
    //退栈; 若栈不空,则函数通过引用参数x 返回栈顶元素值,栈顶指针退 1, 函数指针返回 1;  
    if(S.top==-1) return 0;  
    x=S.elem[S.top--];  
    return 1;   
}  
   
int GetTop(SeqStack &S, SElemType &x) {  
    //读取栈顶元素的值:若栈不空则函数返回栈顶的值且函数返回 1, 否则函数返回 0  
    if(S.top==-1) return 0;  
    x=S.elem[S.top];  
    return 1;   
}  
   
int StackEmpty (SeqStack &S) {//函数测试栈S是否空,若栈空,函数返回 1, 否则返回 0   
    return S.top==-1;//函数返回S.top==-1 的结果   
}  
   
int StackFull(SeqStack &S) {//测试栈S 是否满 ,若栈满,函数返回 1, 否则返回 0  
    return S.top==S.maxsize;//此处为一逻辑表达式, 返回逻辑值的结果   
}  
   
int StackSize(SeqStack &S) {//函数返回栈 S 的长度,即,栈中元素的个数   
    return S.top+1;
}   
   
void Reverse(SElemType A[], int n) {//请空栈 
    SeqStack S;
    InitStack(S);
    int i;  
    for(i=1; i<=n; i++) Push(S, A[i-1]);       
    i=0;  
    while(!StackEmpty(S)) Pop(S, A[i++]);  
}

#endif
注意保存的时候,保存的格式为stack.h, 而不是stack.cpp;
阅读更多
文章标签: 数据结构
上一篇单链表
下一篇队列
想对作者说点什么? 我来说一句

建立栈和栈的逆置 栈操作

2010年05月23日 38KB 下载

链表实现栈

2017年12月28日 2KB 下载

链栈的实现链栈的实现

2010年10月18日 3KB 下载

数据结构实验——链栈

2010年12月22日 300KB 下载

堆与栈的区别.txt

2009年03月02日 7KB 下载

栈的基本操作

2012年11月27日 2KB 下载

没有更多推荐了,返回首页

关闭
关闭