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

来源:互联网 发布:dx 1vb大屏幕显示器 编辑:程序博客网 时间:2024/04/30 09:05

     顺序栈即栈的顺序存储结构,它利用一组地址连续的存储单元存放自栈底到栈顶的元素,是一种后进先出(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 10typedef 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;elsereturn 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;}



阅读全文
1 0
原创粉丝点击