栈也属于线性表中的一种,只不过是操作受限的线性表。
下图是两种存储结构(顺序存储结构和链式存储结构)
基本操作也就:初始化、入栈、出栈、取栈顶元素;
除了基本操作,还应该注意栈与递归的问题,这篇没有涉及,只写到了基本操作。
具体的一些含义和原理可参考诸多数据结构与算法的书籍。
C++实现
#pragma once
#include <iostream>
using namespace std;
typedef int ElemType;
const int Maxsize = 20;
const int ERROR = 0;
const int OK = 1;
class Mystack
{
public:
Mystack();
~Mystack();
int Push(ElemType &record);
int Pop();
ElemType GetTop();
private:
ElemType* base;//顺序栈
ElemType* top;
int stacksize;
};
Mystack::Mystack()
{
base = new ElemType[Maxsize];//判断一下是否开辟成功
if (!base)
exit(ERROR);
top = base;
this->stacksize = Maxsize;
}
int Mystack::Push(ElemType& record)
{
if (top - base == this->stacksize)
return ERROR;
*top = record;
top++;
return OK;
}
int Mystack::Pop()
{
if (top == base)
return ERROR;
else
{
top--;
return OK;
}
}
ElemType Mystack::GetTop()
{
if (top != base)//top指向下一个元素
return *(top - 1);
}
Mystack::~Mystack()
{
if (base!=NULL)
{
delete[] base;
base = NULL;
}
this->stacksize = 0;
this->top = NULL;
}
链栈
#pragma once
#include <iostream>
using namespace std;
typedef int ElemType;
const int Maxsize = 20;
const int ERROR = 0;
const int OK = 1;
class StackNode
{
public:
ElemType data;
StackNode* next;
};
class MyStack
{
public:
MyStack();
int Push(ElemType record);//入栈
int Pop();//出栈
ElemType GetTop();//获得栈顶元素
private:
StackNode *s;//栈顶指针
};
MyStack::MyStack()
{
this->s = NULL;
}
int MyStack::Push(ElemType record)//注意这个时候的指针域方向,即新入栈的指针于要指向上一个入栈的元素
{
StackNode* p;
p = new StackNode;
p->data = record;
p->next = s;
s = p;
return OK;
}
int MyStack::Pop()
{
if (!this->s)
return ERROR;
else
{
StackNode* p;
p = s;
s = s->next;
delete p;
return OK;
}
}
ElemType MyStack::GetTop()
{
if (this->s)
return s->data;
}