栈-基本操作初始化,返回栈顶,出栈,入栈,判断是否空栈

栈-基本操作初始化,返回栈顶,出栈,入栈,判断是否空栈

C语言:

#include <stdio.h> 
#include <stdlib.h>

#define STACK_INIT_SIZE 100        // 存储空间初始化分配量
#define STACKINCREMENT 10          // 存储空间分配增量
#define OVERFLOW -2 
#define OK 1
#define ERROR 0

typedef int Status;
typedef int SElemType;

typedef struct{
	SElemType * base;              // 在栈构造之前和销毁之后,base 的值为 NULL 
	SElemType * top;               // 栈顶指针 
	int stacksize;                 // 当前已分配的存储空间,以元素为单位 
}SqStack;

Status InitStack(SqStack &S)
{
	// 构造一个空栈 
	S.base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
	if(!S.base)
		exit(OVERFLOW);            // 存储分配失败 
	S.top = S.base;
	S.stacksize = STACK_INIT_SIZE;
	return OK;	
}
Status GetTop(SqStack S, SElemType &e)
{
	// 若栈不空,则用 e 返回 S 的栈顶元素,并返回 OK ,否则返回 ERROR
	if(S.top == S.base)
		return ERROR;
	e = *(S.top-1);
	return OK;	  
}
Status Push(SqStack &S, SElemType e)
{
	// 插入元素 e 为新的栈顶元素
	if(S.top - S.base >= S.stacksize){         // 栈满了,追加存储空间 
		S.base = (SElemType *)realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(SElemType));
		if(!S.base)
			exit(OVERFLOW);
		S.top = S.base + S.stacksize;
		S.stacksize += STACKINCREMENT;	
	}
	*S.top++ = e;
	return OK; 
}
Status Pop(SqStack &S, SElemType &e)
{
	// 若栈不空,则删除 S 的栈顶元素, 用 e 返回其值,并返回 OK ,否则返回 ERROE
	if(S.top == S.base)
		return ERROR; 
	e = *(--S.top);
	return OK;
}
Status IsEmpty(SqStack S)
{
	// 若栈为空返回 OK, 否则返回 ERROR 
	if(S.top == S.base)
		return OK;
	return ERROR;	
}
int main()
{
	SqStack stack;
	InitStack(stack);         // 初始化栈 
	
	SElemType e = 88;
	Push(stack, e);           // 将 e 压入栈 
	
	SElemType gete;
	GetTop(stack, gete);      // 得到栈顶元素,用 gete 返回栈顶元素其值 
	printf("%d\n", gete);
	
	if(IsEmpty(stack))       // 判断栈是否为空 
		printf("栈为空\n");
	else 
		printf("栈不为空\n");	
		
	SElemType pope;
	Pop(stack, pope);        // 将栈顶弹出,用 pope 返回栈顶元素其值 
	printf("%d\n", pope);
	
	if(IsEmpty(stack)) 
		printf("栈为空\n");
	else 
		printf("栈不为空\n");	
	
	return 0;
}
/* Code Running Results
88
栈不为空
88
栈为空
*/ 

使用栈的具体事例:
实现表达式中缀转后缀

posted @ 2020-10-06 22:51  狡猾的狐狸科  阅读(964)  评论(0编辑  收藏  举报