数据结构之栈

1 篇文章 0 订阅


顺序栈和链式栈主要函数实现

.h文件

#ifndef MYSQSTACK_H_
#define MYSQSTACK_H_

#pragma region Header
#include <iostream>
#include <cstring>
#include <stdio.h>
#pragma endregion

#pragma region Some rudimentary definition
using SElemType = int;
using ElemType = int;
constexpr int STACK_INIT_SIZE = 100;
constexpr int STACKINCREMENT = 10;
#pragma endregion

#pragma region The struct of Stack
struct SqStack {
	SElemType* top = nullptr;
	SElemType* base = nullptr;
	int stacksize = 0;
};//顺序栈

struct SNode {
	SElemType data = 0;
	SNode* next = nullptr;
};
using LinkStackPtr = SNode*;
struct LinkStack {
	LinkStackPtr top = nullptr;
	LinkStackPtr base = nullptr;
	int length = 0;
};//链式栈

#pragma endregion

#pragma region Function of SqStack
int InitStack(SqStack& S);
int DestoryStack(SqStack& S);
int ClearStack(SqStack& S);
int EmptyStack(SqStack S);
int StackLength(SqStack S);
int GetTop(SqStack& S, ElemType& e);
int Push(SqStack& S, ElemType e);
int Pop(SqStack& S, ElemType& e);
int StackTraverse(SqStack& S, int (*visit)(ElemType&));
#pragma endregion

#pragma region Function of LinkStack
int InitStack(LinkStack& S);
int EmptyStack(LinkStack S);
int StackLength(LinkStack S);
int Push(LinkStack& S, ElemType e);
int Pop(LinkStack& S, ElemType& e);
//int GetTop(LinkStack& S, ElemType& e);
//int DestoryStack(LinkStack& S);
//int ClearStack(LinkStack& S);
//int StackTraverse(LinkStack& S, int (*visit)(ElemType&));
#pragma endregion

#endif // !MYSQSTACK_H_

.cpp文件

#include "MYStack.h"

#pragma region Some rudimentary definition
constexpr int OK = 0;
constexpr int ERROR = -1;
constexpr int TRUE = 1;
constexpr int FALSE = 0;
#pragma endregion

#pragma region visit e.g.
/*
int visit(ElemType& e) {
	e = e + 1;
	return OK;
}
*/
#pragma endregion

#pragma region Function of SqStack
/* 构造空栈 */
int InitStack(SqStack& S) {
	S.base = (SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType));
	if (!S.base) return ERROR;
	S.top = S.base;
	S.stacksize = STACK_INIT_SIZE;
	return OK;
}

/* 摧毁栈 */
int DestoryStack(SqStack& S) {
	if (!S.base) return ERROR;
	free(S.base);
	S.base = nullptr;
	return OK;
}

/* 清空栈 */
int ClearStack(SqStack& S) {
	if (!S.base) return ERROR;
	S.top = S.base;
	return OK;
}

/* 栈顶元素 */
int GetTop(SqStack& S, ElemType& e) {
	if (!S.base || S.base == S.top) return ERROR;
	e = *(S.top - 1);
	return OK;
}

/* 判断栈是否为空 */
int EmptyStack(SqStack S) {
	if (!S.base) return ERROR;
	if (S.base == S.top)
		return TRUE;
	else
		return FALSE;
}

/* 栈长 */
int StackLength(SqStack S) {
	if (!S.base) return ERROR;
	int length;
	length = S.top - S.base;
	return length;
}

/* e入栈 */
int Push(SqStack& S, ElemType e) {
	if (!S.base) return ERROR;
	if (S.top - S.base >= S.stacksize) {
		SElemType* temp = (SElemType*)realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(SElemType));
		if (!temp) return ERROR;
		S.base = temp;
		free(temp);
		S.top = S.base + S.stacksize;
		S.stacksize += STACKINCREMENT;
	}
	*S.top++ = e; //assignment - self addition
	return OK;
}

/* 出栈 */
int Pop(SqStack& S, ElemType& e) {
	if (EmptyStack(S) || !S.base) return ERROR;
	e = *--S.top;
	return OK;
}

/* 对栈中元素调用visit() */
int StackTraverse(SqStack& S, int (*visit)(ElemType&)) {
	if (!S.base) return ERROR;
	SElemType* temp = S.base;
	while (temp <= S.top) {
		if (visit(*(temp))) return ERROR;
		temp++;
	}
	return OK;
}

#pragma endregion

#pragma region Function of LinkStack
/* 构造空栈 */
int InitStack(LinkStack& S) {
	S.base = S.top = new SNode; //  (LinkStackPtr)malloc(sizeof(SNode));
	if (!S.base) return ERROR;
	S.top->next = nullptr;
	return OK;
}
/* 判断栈是否为空 */
int EmptyStack(LinkStack S) {
	if (!S.base) return ERROR;
	if (S.base == S.top)
		return TRUE;
	else
		return FALSE;
}

/* 入栈 */
int Push(LinkStack& S, ElemType e) {
	if (!S.base) return ERROR;
	LinkStackPtr new_S = new SNode;
	new_S->data = e;
	new_S->next = S.top;
	S.top = new_S;
	S.length++;
	return OK;
}

/*  出栈 */
int Pop(LinkStack& S, ElemType& e) {
	if (EmptyStack(S) || !S.base) return ERROR;
	e = S.top->data;
	LinkStackPtr temp = S.top;
	S.top = S.top->next;
	free(temp);
	S.length--;
	return OK;
}

/* 栈长 */
int StackLength(LinkStack S){
	if (!S.base) return ERROR;
	return S.length;
}
#pragma endregion

main函数

#include "MYStack.h"

/*
	Calculator
	input:  Decimal
	output:
*/

int visit(ElemType& e) {
	e = e + 1;
	return 0;
}

/* 输出x的进制数,并将每位数进行visit()变化,比如199转换为8进制为307,进行visit后为408 */
void Decimal_calculator() {
	SqStack S;
	SElemType e = 0;
	long x = 0, base = 0;
	InitStack(S);
	scanf_s("%ld", &x);
	scanf_s("%ld", &base);
	while (x) {
		Push(S, x % base);
		x /= base;
	}
	StackTraverse(S, visit);
	while (!EmptyStack(S)) {
		Pop(S, e);
		std::cout << e;
	}
	DestoryStack(S);
}

int main() {
	Decimal_calculator();
	return 0;
}

输出结果

在这里插入图片描述

小结

学习笔记,欢迎指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值