一、栈简介
在数据结构中,栈是很特殊的一种结构,它是先进后出的存储结构,进行数据的插入和删除的一段为栈顶,另外一端为栈底。
栈又被称为后进先出的线性表。
由于栈是线性表,所以线性表的存储结构对于栈同样适用。栈分为顺序栈和链式栈两种,两种结构存储不同,所以相对应的基本运算也有所不同。
顺序栈和链式栈区别:
1、 顺序栈有“上溢”和“下溢”的概念,“下溢”本身可以表示栈为空栈,因此可以表示为栈的转移条件,而链式栈无这两种概念。
2、链式栈像一条一头固定的链子,可以在一头自由添加结点而不会溢出,链式栈不需要在头部附加结点,因为我们加了头结点反而让我们在头结点之后的结点进行操作,反而使算法更加复杂,所以我们只需要有链表的头指针就可以。
二、栈所支持的操作
构造空栈:InitStack(S)。
判栈空: Empty(S)。
判栈满:Full(S)。
进栈: Push(S,x):可理解为压入,这时栈中会多一个元素。
退栈: Pop(S) :可理解为弹出,弹出后栈中就无此元素。
取栈顶元素:Top(S),只是使用栈顶元素的值,该元素仍在栈顶不会改变。
三、顺序栈的实现
此种方法栈的容量难以扩充的弱点还是很明显的
#include <iostream>
using namespace std;
#define MAX 10
template<class T>
class Stack
{
public:
Stack()
{
InitStack();
}
void InitStack()
{
top = -1;
}
void Push(T x)
{
top++;
if (top < MAX)
arr[top] = x;
else
cout << "Stack FULL!!" << endl;
}
T Pop()
{
if (Empty())
{
cout << "Stack is empty!!" << endl;
return NULL;
}
else
{
T data = arr[top];
arr[top] = NULL;
top--;
return data;
}
}
bool Empty() const
{
return top == -1 ? true : false;
}
int Size() const
{
return top;
}
T Top()
{
if (Empty())
{
cout << "Stack is empty!!" << endl;
return NULL;
}
else
return arr[top];
}
private:
T arr[MAX];
int top;
};
四、链式栈的实现
栈的元素变化范围较大或者不清楚栈元素的数目,采用链式栈的存储结构更好。
代码如下:
#include <iostream>
typedef int ElemType;
using namespace std;
typedef struct StackNode
{
ElemType data;
struct StackNode *next;
}Node,*pNode;
template<class T>
class Stack
{
public:
Stack()
{
count = 0;
InitStack();
}
void InitStack()
{
top = NULL;
}
void push(T data)
{
pNode LinkNode = (pNode)malloc(sizeof(Node));
LinkNode->data = data;
LinkNode->next = top;
top = LinkNode;
count++;
}
bool Pop()
{
if (Empty())
{
cout << "Stack is empty!!" << endk;
return false;
}
pNode s = top->next;
delete top;
top = s;
count--;
return true;
}
pNode Top()
{
if (Empty())
return NULL;
return top;
}
bool Empty()
{
if (count == 0)
return true;
else
return false;
}
int Size()
{
return count;
}
private:
int count;
pNode top;
};