栈(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;
阅读更多 登录后自动展开
想对作者说点什么? 我来说一句

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