1. 程式人生 > >順序棧的初始化,進棧、出棧、求長、判空、訪頂、遍歷、清空、銷燬

順序棧的初始化,進棧、出棧、求長、判空、訪頂、遍歷、清空、銷燬

     順序棧即棧的順序儲存結構,它利用一組地址連續的儲存單元存放自棧底到棧頂的元素,是一種後進先出(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;
}