ADT 栈(stack)
Data
同线性表。元素具有相同地方类型,相邻的元素具有前驱和后继关系
Operation
InitStack(*S):初始化操作,建立一个空栈S
DestroyStack(*S):若栈存在,则销毁他
ClearStack(*S):将栈清空
StackEmpty(S):若栈为空,返回true。否则返回false
GetTop(S,*e);若栈存在且非空,用e返回S的栈顶元素
Push(*S,e):若栈S存在,插入新元素e到栈S中并成为栈顶元素
Pop(*S,*e):删除栈S存在中栈顶的元素,并用e返回其值
StackLength(S):返回栈S的元素个数
endADT
test.hpp
#ifndef TEST_H_
#define TEST_H_
#include"malloc.h"
typedef int SElemType;
typedef struct stackNode
{
SElemType data;
struct stackNode * next;
}stackNode,*LinkStackPtr;
typedef struct LinkStack
{
LinkStackPtr top;
int count;
}LinkStack;
//InitStack(*S):初始化操作,建立一个空栈S
LinkStack * initStack();
//DestroyStack(*S):若栈存在,则销毁他
void destroyStack(LinkStack * S);
//ClearStack(*S):将栈清空
void clearStack(LinkStack * S);
//StackEmpty(S):若栈为空,返回true。否则返回false
bool stackEmpty(const LinkStack S);
//StackLength(S):返回栈S的元素个数
int stackLength(const LinkStack S);
//GetTop(S,*e);若栈存在且非空,用e返回S的栈顶元素
void getTop(const LinkStack S, SElemType * e);
//Push(*S,e):若栈S存在,插入新元素e到栈S中并成为栈顶元素
void push(LinkStack * S, const SElemType e);
//Pop(*S,*e):删除栈S存在中栈顶的元素,并用e返回其值
void pop(LinkStack * S);
#endif // !TEST_H_
#pragma once
test.cpp
#include"test.h"
//InitStack(*S):初始化操作,建立一个空栈S
LinkStack * initStack() {
LinkStack * temp = new LinkStack();
LinkStackPtr first = (LinkStackPtr)malloc(sizeof(stackNode));
first->next = nullptr;
temp->top = first;
temp->count = 0;
return temp;
}
//DestroyStack(*S):若栈存在,则销毁他
void destroyStack(LinkStack * S) {
if (stackEmpty(*S))
return;
free(S);
}
//ClearStack(*S):将栈清空
void clearStack(LinkStack * S) {
if (S->top == nullptr)
return;
LinkStackPtr p = S->top;
LinkStackPtr q;
while (p->next != nullptr)
{
q = p->next;
free(p);
p = q;
}
S->top->next = nullptr;
S->count = 0;
}
//StackEmpty(S):若栈为空,返回true。否则返回false
bool stackEmpty(const LinkStack S) {
if (S.count == 0)
return true;
else
return false;
}
//StackLength(S):返回栈S的元素个数
int stackLength(const LinkStack S) {
return S.count;
}
//GetTop(S,*e);若栈存在且非空,用e返回S的栈顶元素
void getTop(const LinkStack S, SElemType * e) {
if (stackEmpty(S))
return;
*e = S.top->data;
}
//Push(*S,e):若栈S存在,插入新元素e到栈S中并成为栈顶元素
void push(LinkStack * S, const SElemType e) {
LinkStack * p = S;
LinkStackPtr node = (LinkStackPtr)malloc(sizeof(stackNode));
node->data = e;
node->next = S->top;
S->top = node;
S->count++;
}
//Pop(*S,*e):删除栈S存在中栈顶的元素,并用e返回其值
void pop(LinkStack * S) {
if (S->count < 1)
return;
LinkStackPtr p = S->top;
S->top = S->top->next;
free(p);
S->count--;
}
main.cpp
#include<iostream>
#include"test.h"
void showStack(const LinkStack & S);
int main()
{
LinkStack * S = initStack();
std::cout<<"栈是否为空栈: "<<stackEmpty(*S)<<std::endl;
std::cout << "栈的当前长度为: " << stackLength(*S) << std::endl;
showStack(*S);
push(S, 1);
push(S, 2);
push(S, 3);
push(S, 4);
push(S, 5);
push(S, 6);
push(S, 7);
std::cout << "栈是否为空栈: " << stackEmpty(*S) << std::endl;
std::cout << "栈的当前长度为: " << stackLength(*S) << std::endl;
showStack(*S);
pop(S);
std::cout << "栈是否为空栈: " << stackEmpty(*S) << std::endl;
std::cout << "栈的当前长度为: " << stackLength(*S) << std::endl;
showStack(*S);
clearStack(S);
std::cout << "栈是否为空栈: " << stackEmpty(*S) << std::endl;
std::cout << "栈的当前长度为: " << stackLength(*S) << std::endl;
return 0;
}
void showStack(const LinkStack & S) {
if (stackLength(S) == 0)
{
std::cerr << "空栈\n";
return;
}
LinkStack p = S;
while (p.top->next != nullptr)
{
std::cout << p.top->data << " ";
p.top = p.top->next;
}
std::cout << std::endl;
}
运行结果: