顺序栈和链式栈主要函数实现
.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;
}
输出结果
小结
学习笔记,欢迎指正。