首先大致说一下栈这个数据结构,他是一个先进后出的结构,就好比家中摆盘子一样,洗好的盘子放到最上面,当要用的时候从最上面拿走(当然只是一般情况,你要是每次都从下面抽走盘子我也没办法)。
这样的话我们可以直接用前面学过的线性表来实现,但是链的哪边是top呢?仔细分析一下就会发现如果我们用链的结尾作为top,我们删除它(因为这是一个单链表,指针只指向下一个元素),所以当我们用结尾作为top,删除元素后,找不到上一个元素的地址在哪。

struct Snode{
    int date;
    Snode *next;
};
typedef Snode* Stack;

栈的基本操作:
1.创建栈的头节点

Stack creat(){
    Stack s;
    s=new Snode;
    s->next=NULL;
    return s;
}

2.判断是否为空栈

bool isempty(Stack s){
    return s->next==NULL;
}

3.插入元素

void push(int val,Stack s){
    Stack node;
    node=new Snode;
    node->date=val;
    node->next=s->next;
    s->next=node;
}

4.删除元素并返回删除元素的值

int pop(Stack s){  
    Stack firstval;
    int val;
    if(isempty(s)){
        cout<<"堆栈空"<<endl;
        return NULL;
    }
    else{
        firstval=s->next;
        s->next=firstval->next;
        val=firstval->date;
        free(firstval);
        return val;
    }
}

以上就是堆栈的基本操作了。

队列
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
1.创建操作

struct node{
    int date;
    node *next;
};
struct Qnode{
    node *rear;
    node *front;
};
typedef Qnode *Queue;

Queue creat(){
    Queue q;
    q=new Qnode;
    q->front=q->rear=NULL;
    return q;
}

2.插入操作

void push(int val,Queue q){
    node *p;
    p=new node;
    p->date=val;
    p->next=NULL;
    if(q->rear==NULL){  //这里特别重要!!
        q->rear=p;
        q->front=p;
        return ;
    }
    else{
        q->rear->next=p;
        q->rear=p;
    }

    return ;
}

3.出队操作

void del(Queue q){  //出队
    node* frontcell;
    int frontdate;
    if(q->front==NULL) {
        cout<<"empty"<<endl;
        return ;
    }
    frontcell=q->front;
    if(q->front==q->rear){
        q->front=q->rear=NULL;
    }
    else{
        q->front=q->front->next;
    }
    frontdate=frontcell->date;
    free(frontcell);
    cout<<frontdate<<endl;
    return ;
}

4.查看其中元素

void show(Queue q){
    if(q->front==NULL){
        cout<<"empty"<<endl;
        return ;
    }
    node *p;
    p=q->front;
    while(p!=NULL){
        printf("%d ",p->date);
        p=p->next;
    }
    cout<<endl;
    return ;
}

5.返回队首元素

int readfront(Queue q){
    if(q->front==NULL){
        return 0;
    }
    cout<<q->front->date<<endl;
    return 1;
}