我们先来抄书

所有函数,都是抄书,反正考试的时候也要复习,现在提前啃啃哦

第零步

链栈的 增 , 删 , 改 ,查 ,判空等

typedef struct Snode{
    int data;
    struct Snode *next;
}Snode , *LinkStack;
//初始化
bool InitStack(LinkStack &s){
    s = NULL;
    return true;
}
//判断是否为空
bool Empty(LinkStack s){
    if(s == NULL) return true;
    return false;
}
//入栈
bool Push(LinkStack &s , int e){
    LinkStack p = new Snode;
    p -> data = e;
    p -> next = s;
    s = p;
    return true;
}
//出栈
bool Pop(LinkStack &s , int &e){
    if(Empty(s)) return false;
    e = s->data;
    LinkStack p = s;
    s = s->next;
    delete p;
    return true;
}
//取栈顶元素
int GetTop(LinkStack s){
    if(Empty(s)) return false;
    return s->data;
}

表达式求值里已经写过了,一模一样,就不赘述

第一步

定义队列

typedef struct{
    int *base;
    int front;
    int rear;
}SqQueue;

第二步

判断队空

bool QEmpty(SqQueue q){
    if(q.front == q.rear) return true;
    return false ;
}

第三步

队列的初始化

//队列的初始化
int InitQueue(SqQueue &q){
    q.base = new int(Maxsize);
    if(!q.base) exit(OVERFLOW);
    q.front = q.rear = 0;
    return true;
}

第四步

判断队满

//判断队满
bool Full(SqQueue q){
    if((q.rear +1) % Maxsize == q.front) return true;
    return false;
}

第五步

入队

bool Enqueue(SqQueue &q , int e){
    if(Full(q)) return false;
    else{
        q.base[q.rear] = e;
        q.rear = (q.rear +1 )% Maxsize;
        return true;
    }
}

第六步

出队

bool Dequeue(SqQueue &q , int &e){
    if(QEmpty(q)) return false;
    e = q.base[q.front];
    q.front = (q.front + 1) % Maxsize;
    return true;
}

第七步

取队首元素

int GetHead(SqQueue q){
    if(QEmpty(q)) return false;
    return q.base[q.front];
}

开始写

第八步

思路,就先把栈的元素,放到队列里,然后准备一个中间栈,当队列中的元素和删除的元素值不相等时,就把元素,放进中间栈中,放完后,在从中间栈,按顺序再放到原栈里
图片
main函数

int main()
{
    SqQueue q;                     //定义和初始化(栈还有队列的)
    InitQueue(q);
    LinkStack s , s1;
    InitStack(s);
    InitStack(s1);
    int n;                    //原来栈的元素个数
    cout<<"请输入栈元素个数"<<"\n";
    cin >> n;     
    int t;
    cout<< "请输入栈元素" <<"\n";
    for(int i = 0 ;i < n;i++){
        cin >> t;                //输入,栈中原来的元素,并放入栈中
        Push(s, t);
    }
    while(!Empty(s)){                // 当s不为空时,将s中的元素,一个个放进队列中
        int t1;
        Pop(s, t1);
        Enqueue(q, t1);
    }
    cout<<"请输入要删除的特定值"<<"\n";
    int t3;                    //要删除的特定值
    cin >> t3;
    while(!QEmpty(q)){            //当队列不为空的时候
        if(GetHead(q) != t3){        //当队头元素,和要删除的元素不相等的时候,把它放入中间栈中
            Push(s1, GetHead(q));
        }
        int e;
        Dequeue(q, e);            //一个个出栈的同时,放入,中间栈
    }
    while(!Empty(s1)){               // 当中间栈不为空的时候,将中间栈的元素,放回原栈
        Push(s, GetTop(s1));
        int c;
        Pop(s1, c);
    }
    s1 = s;
    while(s1){
        cout << s1->data <<" ";     // 输出原栈s中的元素
        s1 = s1 ->next;
    }
    cout << "\n";
}