:::info 存储形式以及操作和顺序表和链表差不多,需要的操作也少,学栈和队列,感觉只是抽离出来这两种便于在应用层面使用 :::
顺序栈
#include<bits/stdc++.h>
typedef int Status;
typedef int SElemType;
#define OVERFLOW -1
#define ERROR 0
#define OK 1
#define MAXSIZE 100
using namespace std;
/**
* 顺序栈
*
* 顺序栈的基本操作:初始化、入栈、出栈、取栈顶元素
*/
/* 顺序栈的存储形式 */
typedef struct {
SElemType *base;
SElemType *top;
int stacksize;
} SqStack;
/* 初始化 */
Status InitSqStack(SqStack &stack) {
// 为栈分配容量
stack.base = new int[MAXSIZE];
// 分配失败返回失败值
if (!stack.base) {
return OVERFLOW;
}
// 让栈顶地址初始为栈底地址
stack.top = stack.base;
// 初始化容量
stack.stacksize = MAXSIZE;
return OK;
}
/* 入栈 */
Status Push(SqStack &stack, SElemType e) {
if (stack.top - stack.base == stack.stacksize) {
return OVERFLOW;
}
*stack.top = e; // 先在top位置赋值
stack.top++; // 将top地址++
return OK;
}
/* 出栈 */
Status Pop(SqStack &stack) {
// 空栈返回异常
if (stack.top == stack.base) {
return OVERFLOW;
}
stack.top--; // 栈顶地址减1
return *stack.top; // 返回此时“栈顶”元素
}
/* 取栈顶元素 */
Status GetTop (SqStack &stack) {
// 空栈返回异常
if (stack.top == stack.base) {
return OVERFLOW;
}
// stack.top--; // 栈顶地址减1,这是和出栈的区别
return *(stack.top-1); // 返回此时“栈顶”元素
}
int main() {
SqStack test;
InitSqStack(test);
Push(test, 10);
Push(test, 15);
Push(test, 20);
cout << GetTop(test)<<" "<< GetTop(test)<<" "<< GetTop(test)<<" "<<"\n";
cout << Pop(test)<<" "<< Pop(test)<<" "<< Pop(test)<<" "<<"\n";
}
链栈
#include<bits/stdc++.h>
typedef int Status;
typedef int SElemType;
#define OVERFLOW -1
#define ERROR 0
#define OK 1
#define MAXSIZE 100
using namespace std;
/**
* 链栈
*
* 链栈的基本操作:初始化、入栈、出栈、取栈顶元素
*/
/* 链栈的存储形式 */
typedef struct StackNode{
SElemType data;
struct StackNode *next;
} StackNode, *LinkStack;
/**
* 初始化
* 不设头结点
*/
Status InitLinkStack(LinkStack &stack) {
stack = NULL; // 栈顶元素置空
return OK;
}
/* 入栈 */
Status Push(LinkStack &stack, SElemType e) {
// 不能用LinkStack这样声明结点变量,需要new一个内存空间
LinkStack temp = new StackNode;
temp->data = e;
temp->next = stack;
stack = temp;
return OK;
}
/* 出栈 */
Status Pop (LinkStack &stack) {
SElemType i = stack->data;
stack = stack->next;
return i;
}
/* 取栈顶元素 */
Status GetTop (LinkStack &stack) {
return stack->data;
}
int main() {
LinkStack test;
InitLinkStack(test);
Push(test, 10);
Push(test, 15);
Push(test, 20);
cout << GetTop(test)<<" "<< GetTop(test)<<" "<< GetTop(test)<<" "<<"\n";
cout << Pop(test)<<" "<< Pop(test)<<" "<< Pop(test)<<" "<<"\n";
}