原创 2018年04月17日 18:31:49

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

1.顺序栈

#include<stdio.h>
#include<stdlib.h>
 
#define initSize 30 
 
typedef int DataType;
typedef int SElemType;
typedef struct {//顺序栈的静态存储结构,存储于 SeqStack.h 中 
	SElemType elem[maxsize];
	int top;// 栈空时,top为 -1 
}SeqStack;
 
typedef struct {//顺序栈的动态存储结构 
	SElemType *elem;
	int maxsize, top;
}SeqStack;
 
void InitStack(Stack &s) //为栈S 分配存储空间,并对各数据成员赋初值 
 
int Push(Stack &s, SElemType &x)//先决条件:栈S 已经存在并且不为空,若栈S 为空,则函数返回0 ,否则栈S 的栈顶元素退栈,退出元素由X 返回,函数返回 1 
 
int GetTop(Stack &S, SElemType &x)//由引用型参数 X 返回栈顶元素的值,但不退栈 
 
int StackEmpty(Stack &S)//测试栈S 是否为空栈,若栈空,返回1 ,否则返回 0 
 
int StackFull(Stack &S)//测试栈S 是否栈满;若栈满返回 1, 否则返回 0 
 
int StackSize(Stack &S)//函数返回栈S 的长度,即栈中元素的个数 
 
 
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) {
	Stack 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;
}

收藏助手
不良信息举报
您举报文章:
举报原因:
原因补充:

(最多只允许输入30个字)