[NEFU锐格 数据结构]实验二 栈和队列有关的操作

Posted 鱼竿钓鱼干

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[NEFU锐格 数据结构]实验二 栈和队列有关的操作相关的知识,希望对你有一定的参考价值。

[NEFU锐格 数据结构]实验二 栈和队列有关的操作

推荐阅读
[数据结构]NEFU 大二上 锐格实验参考 目录

知识点

题目知识点
8797链式队列计算杨辉三角
8563顺序存储栈基本操作
8562链式栈基本操作
8566利用栈实现进制转化
8569利用栈进行表达式计算
8564链式队列基本操作
8565循环队列基本操作

题目

8797

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdbool.h>

typedef struct Node{
    int data;
    struct Node *next;
}LQNode,*LinkQNode;
typedef struct{
    LQNode *front,*rear;
}LQueue,*LinkQueue;

int QueueInit(LinkQueue &Q){
    LinkQNode p;
    Q=(LinkQueue)malloc(sizeof(LQueue));//申请头尾指针节点
    p=(LinkQNode)malloc(sizeof(LQNode));//申请链队头节点
    p->next=NULL;Q->front=Q->rear=p;
    return 1;
}
void QueuePush(LinkQueue &Q,int x){
    LinkQNode p=(LinkQNode)malloc(sizeof(LQNode));
    p->data=x;
    p->next=NULL;
    Q->rear->next=p;
    Q->rear=p;
}
bool QueueEmpty(LinkQueue Q){
    if(Q->front==Q->rear)return true;
    return false;
}
bool QueuePop(LinkQueue &Q,int &x){
    if(QueueEmpty(Q)){
        puts("Queue Empty!");
        return 0;
    }
    LinkQNode p=Q->front->next;
    Q->front->next=p->next;
    x=p->data;
    if(p==Q->rear)Q->rear=Q->front;//只有一个元素的话,出队后为空
    delete p;
    return 1;
}
bool GetHead(LinkQueue Q,int &head){
    if(QueueEmpty(Q))return false;
    head=Q->front->next->data;
    return true;
}
int main(){
    int n,out,head;scanf("%d",&n);
    LinkQueue Q;
    QueueInit(Q);QueuePush(Q,1);
    for(int i=2;i<=n;i++){
        QueuePush(Q,1);
        for(int j=1;j<=i-2;j++){
            QueuePop(Q,out);
            printf("%d ",out);
            GetHead(Q,head);
            out+=head;
            QueuePush(Q,out);
        }
        QueuePop(Q,out);
        printf("%d ",out);
        QueuePush(Q,1);
        puts("");
    }
    while(!QueueEmpty(Q)){
        QueuePop(Q,out);
        printf("%d ",out);
    }
    return 0;
}

8563

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdbool.h>
#define MAXSIZE 1024
typedef struct {
    int data[MAXSIZE];
    int top;
}SeqStack;

bool StackInit(SeqStack &S){
    S.top=-1;return 1;
}
bool StackEmpty(SeqStack S){
    if(S.top==-1)return 1;
    return 0;
}
bool StackPush(SeqStack &S,int x){
    if(S.top==MAXSIZE-1){
        puts("栈满");
        return 0;
    }
    S.top++;
    S.data[S.top]=x;
    return 1;
}
bool StackPop(SeqStack &S,int &x){
    if(S.top==-1){
        puts("栈空");
        return 0;
    }
    x=S.data[S.top];
    S.top--;
    return 0;
}
bool StackGetTop(SeqStack S,int &x){
    if(S.top==-1){
        puts("栈空");
        return 0;
    }
    x=S.data[S.top];
    return 1;
}
int main(){
    int x;
    SeqStack Stk;
    StackInit(Stk);
    while(~scanf("%d",&x)){
        if(x==0)break;
        StackPush(Stk,x);
    }
    while(!StackEmpty(Stk)){
        StackPop(Stk,x);
        printf("%d ",x);
    }
    return 0;
}

8562

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdbool.h>

typedef struct StackNode{
    int data;
    struct StackNode *next;
}StackNode,*LinkStack;

bool StackInit(LinkStack &top){
    top=NULL;return 1;
}
bool StackEmpty(LinkStack top){
    if(top==NULL)return 1;
    return 0;
}
void StackPush(LinkStack &top,int x){
    StackNode *s;
    s=(StackNode*)malloc(sizeof(StackNode));
    s->data=x;
    s->next=top;
    top=s;
}
bool StackPop(LinkStack &top,int &x){
    if(top==NULL){
        puts("Stack Empty!");return 0;
    }
    x=top->data;
    StackNode *p=top;
    top=top->next;
    free(p);
    return 1;
}

int main(){
    int x;
    LinkStack Stk;
    StackInit(Stk);
    while(~scanf("%d",&x)){
        if(x==0)break;
        StackPush(Stk,x);
    }
    while(!StackEmpty(Stk)){
        StackPop(Stk,x);
        printf("%d ",x);
    }
    return 0;
}

8566

如果不是直接pop输出的话注意数据可能爆long long

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdbool.h>
#define MAXSIZE 1024
typedef struct {
    int data[MAXSIZE];
    int top;
}SeqStack;

bool StackInit(SeqStack &S){
    S.top=-1;return 1;
}
bool StackEmpty(SeqStack S){
    if(S.top==-1)return 1;
    return 0;
}
bool StackPush(SeqStack &S,int x){
    if(S.top==MAXSIZE-1){
        puts("栈满");
        return 0;
    }
    S.top++;
    S.data[S.top]=x;
    return 1;
}
bool StackPop(SeqStack &S,int &x){
    if(S.top==-1){
        puts("栈空");return 0;
    }
    x=S.data[S.top];
    S.top--;
    return 0;
}
bool StackGetTop(SeqStack S,int &x){
    if(S.top==-1){
        puts("栈空");return 0;
    }
    x=S.data[S.top];
    return 1;
}

long long convert(int x,int r){
    SeqStack Stk;
    StackInit(Stk);
    while(x){
        StackPush(Stk,x%r);
        x/=r;
    }
    long long res=0;
    int e;
    while(!StackEmpty(Stk)){
        StackPop(Stk,e);
        res=res*10+e;
    }
    return res;
}
int main(){
    int a,r;scanf("%d%d",&a,&r);
    long long b=convert(a,r);
    printf("%d(10)=%lld(%d)",a,b,r);
    return 0;
}

8569

上课上到了再补不用STL的写法

在这里插入代码片

可扩展运算符的c++代码

#include<bits/stdc++.h>
using namespace std;

const int N=1e5+10;
stack<int> num;
stack<char> op;

void eval(){
    auto b=num.top();num.pop();
    auto a=num.top();num.pop();
    auto c=op.top();op.pop();
    int x;
    if(c=='+')x=a+b;
    else if(c=='-')x=a-b;
    else if(c=='*')x=a*b;
    else x=a/b;
    num.push(x);
}
int main()
{
    unordered_map<char,int>pr{{'+',1},{'-',1},{'*',2},{'/',2}};//运算符优先级
    string s;
    cin>>s;
    for(int i=0;i<s.size()-1;i++)
    {
        auto c=s[i];
        if(isdigit(c))//转数字
        {
            int x=0,j=i;
            while(j<s.size()&&isdigit(s[j]))
                x=x*10+s[j++]-'0';
            i=j-1;
            num.push(x);
        }
        else if(c=='(')op.push(c);
        else if(c==')')//括号直接算
        {
            while(op.top()!='(')eval();
            op.pop();
        }
        else
        {
            while(op.size()&&pr[op.top()]>=pr[c])eval();//如果当前优先级比前面的低就算
            op.push(c);//操作符入栈
        }
    }
    while(op.size())eval();//剩余计算
    printf("%d",num.top());
    return 0;
}

8564

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdbool.h>

typedef struct Node{
    int data;
    struct Node *next;
}LQNode,*LinkQNode;
typedef struct{
    LQNode *front,*rear;
}LQueue,*LinkQueue;

int QueueInit(LinkQueue &Q){
    LinkQNode p;
    Q=(LinkQueue)malloc(sizeof(LQueue));//申请头尾指针节点
    p=(LinkQNode)malloc(sizeof(LQNode));//申请链队头节点
    p->next=NULL;Q->front=Q->rear=p;
    return 1;
}
void QueuePush(LinkQueue &Q,int x){
    LinkQNode p=(LinkQNode)malloc(sizeof(LQNode));
    p->data=x;
    p->next=NULL;
    Q->rear->

以上是关于[NEFU锐格 数据结构]实验二 栈和队列有关的操作的主要内容,如果未能解决你的问题,请参考以下文章

[NEFU锐格 数据结构]实验五六 图有关的操作

[NEFU锐格 数据结构]实验八 排序表有关的操作

[NEFU锐格 数据结构]实验七 查找有关的操作

[NEFU锐格 数据结构]实验三四 二叉树常见的操作

[JAVA] NEFU 大二下锐格 目录

[NEFU 数据结构]阶段一复习