数据结构和算法学习总结04 线性表---栈

栈(Stack)是特殊的线性表,是只允许在一端进行插入和删除的线性表。

允许插入和删除的叫栈顶,反之则是栈底。

栈的插入称为进栈,删除称为出栈。

特性是:后进先出,所以栈也叫后进先出表,简称LIFO表(Last In First Out)。

因为栈是线性表,所以也有顺序表和链表两种形式,一般我们常用顺序栈。

从代码中可以看出:与顺序表相比实际上就是插入和删除操作发生了改变

 

#include <iostream>  
using namespace std;  

const int Stack_Size = 5;  

class SqStack  
{  
private:
    int *elem;  
    int top;  
    int stackSize;
public:
    void InitSqStack();        //顺序栈的初始化
    int GetTop();              //获得栈顶元素
    int Length();              //获得当前栈的容量
    void DestroySqStack();     //销毁顺序栈
    void ClearSqStack();       //清空顺序栈
    void Push(int v);          //压栈/入栈/进栈
    int Pop();                 //出栈
    void InputSqStack(int n);  //输入元素
    void OutputSqStack();      //遍历输出
};  



void SqStack::InitSqStack()  
{  
    elem=new int[Stack_Size];  
    top=-1;  
    stackSize=Stack_Size; 
}  

int SqStack::GetTop()
{
    if(top==-1)
        cout<<"空栈"<<endl;
    int e = elem[top];
    return e;
}
int SqStack::Length()
{
    if(top==-1)
        cout<<"空栈"<<endl;
    return top+1;
}  

void SqStack::DestroySqStack()  
{  
    delete[] elem;  
    top=-1;  
    stackSize=0;  
}  

void SqStack::ClearSqStack()
{
    top=-1;
}

void SqStack::Push(int v)  
{  
    if(top==stackSize-1) 
    {
        int *newStack;
        newStack = new int[stackSize + 1];
        for(int i=0;i<=top;i++)
        {
            newStack[i]=elem[i];
        }
        delete[] elem;
        elem = newStack;
        stackSize++;
    }
    elem[++top]=v;  
}  

int SqStack::Pop()  
{  
    int v;  
    if(top==-1)  
        cout<<"空栈"<<endl;  
    v=elem[top--];  
    return v;  
}  

void SqStack::InputSqStack(int n)
{
    int a; 
    cout<<"enter numbers:"<<endl; 
    for (int i = 0; i < n; i++) 
    { 
        cin>>a;
        Push(a);
    } 
}

void SqStack::OutputSqStack()
{ 
    if ((elem == NULL)||(top==-1))
        cout<<"出现错误"<<endl; 
    else 
    { 
        for (int i = 0; i <= top; i++) 
        { 
            cout<<elem[top-i]<<" "; 
        } 
        cout<<endl;
    } 
}

void main()  
{  
    SqStack S;  
    S.InitSqStack();  
    S.InputSqStack(6);
    S.OutputSqStack();
    cout<<S.GetTop()<<endl;  
    S.Pop(); 
    S.OutputSqStack();
}  

 

 

 

链栈的情况(简单实现,主要代码),使用链表的头插法

struct Node
{
    int data;
    Node *next;
};

class Stack  
{  
private:
    Node *top;
public:
    Stack(){ 
        top = new Node;
        top->next = NULL;
    }
    void Push(int v);  
    int Pop();        
    void InputStack(int n);  
    void OutputStack();   
};  

void Stack::Push(int v)  
{  
    Node *p;
    p=new Node;
    p->data=v;
    p->next=top;             //用的是头插法,top始终是栈顶
    top =p;
}  

int Stack::Pop()  
{  
    Node *p;
    int x;
    p=top;
    top=p->next;             //删除节点,用x记录要删除的元素。
    x=p->data;
    delete p;
    return x;
}  

void Stack::InputStack(int n)
{
    int a; 
    cout<<"enter numbers:"<<endl; 
    for (int i = 0; i < n; i++) 
    { 
        cin>>a;
        Push(a);
    } 
}

void Stack::OutputStack()
{ 
   Node *p;
   p= top;
   while(p->next!=NULL)
   {
       cout<<p->data<<" ";
       p = p->next;
   }
   cout<<endl;
}

void main()  
{  
    Stack S;    
    S.InputStack(5);
    S.OutputStack();
    cout<<S.Pop()<<endl;  
    S.OutputStack();
} 

在这里的top不是头指针,直接就是头结点。

 

posted @ 2017-09-13 21:49  yourallworld  阅读(204)  评论(0编辑  收藏  举报