栈的相关知识与代码实现

2017-07-16  本文已影响0人  曲谐_

一、栈的相关知识

栈的定义:

是限定仅在表尾进行插入和删除操作的线性表。
我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈。栈又称为后进先出(Last In First Out,LIFO)的线性表。

理解栈的定义需要注意:

进栈出栈变化形式:

问题:最先进栈的元素,是不是就只能最后出栈呢?
答:不一定。因为没有对栈内元素出入时间做限制。在不是所有元素都进栈的情况下,事先进去的元素也可以出栈,只要保证是栈顶元素即可。
举例:有三个数字1,2,3依次进栈,有哪些出栈次序呢?

栈的顺序存储结构

两栈共享空间

提出思路:因为有的时候对于两个栈,类型相同,而其中一个利用率不高,另一个却有快溢出迹象的时候,可以将两个栈共享使用,使得利用率提高。
做法:数组有两个端点,两个栈有两个栈底,让一个栈底下标为0,另一个栈底为数组的末端,即下标为n-1。这样两个栈增加元素就是两端点向中间延伸
由此可见,top1和top2是栈1和栈2的栈顶指针,只要它们俩不见面,两个栈就可以一直使用。
栈1为空时,top1=-1,栈2位空时,top2=n
问题:什么时候栈满?
:想想极端情况。

使用条件:通常是两个栈的空间需求有相反关系,也即一个栈增长另一个栈缩短。像买股票一样,一个人买入一定有一个你不知道的人在卖出。有人赚钱,另一个人就赔钱。

栈的链式存储结构

二、代码实现

顺序栈的代码实现

//SeqStack.h
#ifndef SEQSTACK_H_
#define SEQSTACK_H_
const int StackSize = 40;
class SeqStack
{
private:
    int top;
    int num[StackSize];
public:
    SeqStack();
    ~SeqStack();
    void Push(int e);
    void Pop();
    bool isempty();
    bool isfull();
    void clear();
    void Print();
};
#endif

头文件SeqStack.h,包含了入栈出栈判断里面是否是满的以及清空等功能。
这个栈存储了一个int数组。

#include<iostream>
#include"SeqStack.h"
using std::cout;
using std::endl;
SeqStack::SeqStack():top(-1){}
SeqStack::~SeqStack(){}
void SeqStack::Push(int e)
{
    if(isfull())
    {
        cout << "Stack is Full!Push failed." << endl;
        return;
    }
    num[++top] = e;
}
void SeqStack::Pop()
{
    if(isempty())
    {
        cout << "Stack is Empty!Pop failed." << endl;
        return;
    }
    top--;
}
bool SeqStack::isempty()
{
    if(top == -1)
    {
        cout << "Stack is empty!" << endl;
        return true;
    }
    return false;
}
bool SeqStack::isfull()
{
    if(top == StackSize - 1)
    {
        cout << "Stack is full!" << endl;
        return true;
    }
    return false;
}
void SeqStack::clear()
{
    if(isempty())
        cout << "SeqStack is already empty!" << endl;
    while(top!=-1)
    {
        Pop();
        top--;
    }
}
void SeqStack::Print()
{
    if(isempty())
        cout << "No elements printed." << endl;
    for(int i=0;i<top;i++)
        cout << num[i] << " ";
    cout << endl;
}

函数实现SeqStack.cpp,可以自己建立一个简单的程序验证一下,这里不再赘述。

链栈的代码实现

//LinkStack.h
#ifndef LINKSTACK_H_
#define LINKSTACK_H_
class LinkStack
{
private:
    struct StackNode
    {
        int num;//存储数据
        StackNode * next;//next指针
    };
    StackNode * top;
    int length;
public:
    LinkStack();
    ~LinkStack();
    void Push(int e);
    void Pop();
    bool isempty();
    void clear();
    void Print();
};
#endif

链栈头文件,存储变量和方法。

//LinkStack.cpp
#include<iostream>
#include"LinkStack.h"
using std::cout;
using std::endl;
LinkStack::LinkStack()
{
    top = NULL;
    length = 0;
}
LinkStack::~LinkStack()
{
}
void LinkStack::Push(int e)
{
    StackNode * p = new StackNode;
    p->num=e;
    p->next=top;
    top=p;
    length++;
}
void LinkStack::Pop()
{
    StackNode * p = new StackNode;
    if(top == NULL)
    {
        cout << "The LinkStack is empty!Cannot pop!" << endl;
        return;
    }
    p=top;
    top=top->next;
    delete p;
    length--;
}
void LinkStack::clear()
{
    while(top)
    {
        StackNode * temp = top;
        top = top->next;
        delete temp;
        length--;
    }
}
void LinkStack::Print()
{
    if(top == NULL)
    {
        cout << "No elements!" << endl;
        return;
    }
    StackNode * temp = top;
    while(temp)
    {
        cout << temp->num << " ";
        temp = temp->next;
    }
    cout << endl;
}
上一篇 下一篇

猜你喜欢

热点阅读