天天看点

顺序栈的初始化,进栈、出栈、求长、判空、访顶、遍历、清空、销毁

     顺序栈即栈的顺序存储结构,它利用一组地址连续的存储单元存放自栈底到栈顶的元素,是一种后进先出(last in first out,LIFO)的线性表。

     判断栈不存在的条件为:S.base=NULL;

     空栈:S.base=S.top; 

     满栈:S.top-S.base=S.stacksize; 

顺序栈的初始化,进栈、出栈、求长、判空、访顶、遍历、清空、销毁
#include "stdafx.h"    
#include <iostream>  
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef int ElemType;
typedef int Status;
using namespace std;
typedef struct Stack
{
	int *base;
	int *top;
	int stacksize;    //当前已分配的存储空间
}SqStack;

bool initStack(SqStack &S) {
	S.base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
	if (!S.base)
	{
		cout << "内存分配失败!" << endl;
		exit(OVERFLOW);
	}
	S.top = S.base;
	S.stacksize = STACK_INIT_SIZE;
	return true;
}
//判断栈是否为空
bool isStackEmpty(SqStack &S) {
	if (S.top == S.base)
		return true;
	else
		return false;
}
//取栈顶元素,并将值返回
Status getTop(SqStack &S) {
	if (isStackEmpty(S))
	{
		cout << "栈为空!" << endl;
		return 0;
	}
	return *(S.top - 1);
}
//插入元素e为栈顶元素
Status push(SqStack &S, ElemType e) {
	if (S.top - S.base >= S.stacksize)   //栈满,追加栈的空间
	{
		S.base = (ElemType *)realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(ElemType));
		if (!S.base)
		{
			exit(OVERFLOW);
		}
		S.top = S.base + S.stacksize;   //基地址+当前内存空间
		S.stacksize += STACKINCREMENT;
	}
	*S.top = e;
	S.top++;
	return true;
}
//删除栈顶元素,并返回
Status pop(SqStack &S) {
	ElemType e;
	if (isStackEmpty(S))
	{
		cout << "栈为空!" << endl;
		return false;
	}
	return *(--S.top);
}
//获取栈的长度
Status getStackLength(SqStack &S) {
	return S.top - S.base;
}

//清空栈
bool clearStack(SqStack &S) {
	while (!isStackEmpty(S))
		pop(S);
	return true;
}
//销毁栈
bool destroyStack(SqStack &S) {
	clearStack(S);
	S.stacksize = 0;
	S.top = S.base = NULL;
	return true;
}
Status visit(ElemType e) {
	cout << e << "  ";
	return true;
}
//遍历栈,遍历顺序为出栈的顺序
void stackTraverse(SqStack &S) {
	if (isStackEmpty(S)) {
		cout << "栈为空!" << endl;
		exit(0);
	}
	while (!isStackEmpty(S))
	{
		visit(*(--S.top));
	}
	cout << endl;
}
int main() {
	SqStack stack;
	cout << "构造了一个空栈" << endl;;
	initStack(stack);
	ElemType e;
	cout << "向栈中插入第一个元素:";
	cin >> e;
	push(stack, e);
	cout << "向栈中插入第二个元素:";
	cin >> e;
	push(stack, e);
	cout << "向栈中插入第三个元素:";
	cin >> e;
	push(stack, e);
	cout << "获取栈顶元素:" << getTop(stack);
	cout << endl << "执行一次出栈操作,出栈元素为:" << pop(stack);
	cout << endl << "获取栈顶元素:" << getTop(stack);
	cout << endl << "获取栈的长度:" << getStackLength(stack);
	cout << endl << "遍历栈:";
	stackTraverse(stack);
	cout << "执行清栈操作" << endl;;
	clearStack(stack);
	stackTraverse(stack);
	system("pause");
	return 0;
}
           

继续阅读