【数据结构】第五周

目录

进制转换问题

字符串镜像

表达式求值

队列元素逆置

杨辉三角形​​​​​​​


进制转换问题

【问题描述】根据课堂讲授,请用“顺序栈”解决进制转换问题,不采用顺序栈,不给分。
【输入形式】十进制数据和待转换的进制
【输出形式】转换后的数据
【样例输入1】1348 8
【样例输出1】2504
【样例输入2】2608 16
【样例输出2】A30

#include<iostream>
using namespace std;
typedef struct{
	char data[100];
	int top;
}SqStack;

void push(SqStack &kk,char n)
{
	kk.data[++kk.top]=n;
}
void pop(SqStack &kk)
{
	cout<<kk.data[kk.top--];
}
int main()
{
	SqStack kk;
	kk.top=-1;
	int m,n,f;
	char ch;
	cin>>m>>n;
	while(m)
	{
		f=m%n;
		if(f>=10&&n>=10) ch=f+'A'-10;
		else ch=f+'0';
		push(kk,ch);
		m/=n;
	}
	while(kk.top!=-1)
	{
		pop(kk);
	}
	return 0;
}

字符串镜像

【问题描述】试写一个算法,识别依次读入的一个以“@”为结束符的字符序列是否为形如 “序列1&序列2”  模式的字符序列。其中序列1和序列2都不含字符 “&”,且序列2是序列1的逆序列。例如,“ a+b&b+a ”是属该模式的字符序列,而 “1+3&3-1”则不是。

【输入形式】
 以@为结尾的一串字符

【输出形式】
 若符合模式则输出字符串长度,否则输出no

【样例输入】
 a+b&b+a@

【样例输出】
 3

【注意】本题务必使用顺序栈或者链式栈的一种来实现,否则不给分。

//2. 字符串镜像
#include<iostream>
using namespace std;
#include<cstring>
#include<cstdio>

typedef struct{
	char data[1000];
	int top;
}SqStack;
SqStack str1;
int str2[1000];
void push(SqStack &kk,char n)
{
	kk.data[++kk.top]=n;
}
int pop(SqStack &kk)
{
	return kk.data[kk.top--];
}
int main()
{
	str1.top=-1;
	char ch;
	ch=getchar();
	while(ch!='&')
	{   push(str1,ch);
		ch=getchar();
	}
	ch=getchar();
	int j=0;
	while(ch!='@')
	{ str2[j++]=ch;
    	ch=getchar();
	}
	j--;
	//cout<<str1.top<<" "<<j<<endl;
	if(str1.top!=j) {
	cout<<"no";return 0;}
	//cout<<str1<<endl<<str2<<endl;
	int jj=0;
	for(jj=0;jj<=j;jj++)
	{
	
			if(pop(str1)!=str2[jj])
			   {
			   cout<<"no";return 0;}
			   
	}
	if(str1.top!=-1)
	{
		cout<<"no";return 0;
	}
	cout<<j+1;//0-j lenth=j+1
	return 0;
	
}

表达式求值

【问题描述】栈的应用,给定一个以“#”作为结束符的算式,求出算式的结果

【输入形式】以“#”结尾的表达式,运算数为正整数。每个表达式占一行。

【输出形式】输出表达式运算的结果。

【样例输入1】4+2.53*3-10/5#

【样例输出1】9.59

【样例输入2】3*(7.91-2)#

【样例输出2】17.73

【样例输入3】2.4*3.6/2#

【样例输出3】4.32

【注意】分别运用C和C++语言如何处理表达式中带小数的数据,输出数据请保留2位小数。

#include <bits/stdc++.h>
using namespace std;
template <typename T>
struct mstack
{
    T a[1000];
    int top;
    void push(T t)
    {
        a[++top]=t;
    }
    void pop()
    {
        top--;
    }
    T get()
    {
        return a[top];
    }
};

char Compare(char a,char b)   
{
    int i=0,j=0;
    char pre[7][7]={
		             {'>','>','<','<','<','>','>'},
                     {'>','>','<','<','<','>','>'},
                     {'>','>','>','>','<','>','>'},
                     {'>','>','>','>','<','>','>'},
                     {'<','<','<','<','<','=','0'},
                     {'>','>','>','>','0','>','>'},
                     {'<','<','<','<','<','0','='}
                    };
    switch(a)
    {
        case '+':i=0;break;
        case '-':i=1;break;
        case '*':i=2;break;
        case '/':i=3;break;
        case '(':i=4;break;
        case ')':i=5;break;
        case '#':i=6;break;
    }
    switch(b)
    {
        case '+':j=0;break;
        case '-':j=1;break;
        case '*':j=2;break;
        case '/':j=3;break;
        case '(':j=4;break;
        case ')':j=5;break;
        case '#':j=6;break;
    }
    return pre[i][j];
}
double oper(char c,double x,double y)
{
    switch(c)
    {
    case '+':return x+y;
    case '-':return x-y;
    case '*':return x*y;
    case '/':return x/y;
    }
    return -1000;
}
int main()
{
    char ch;
    double x;
    while(cin>>ch)
    {
        mstack<double> A;
        mstack<char> B;
        A.top=-1;
		B.top=-1;//B 存储符号 
        B.push('#');
        while(1)
        {
            if(ch>='0'&&ch<='9')
            {
                cin.putback(ch);
                cin>>x;
                A.push(x);
                cin>>ch;
            }
            else
                switch(Compare(B.get(),ch))
                {
                case '<':
                    B.push(ch);
                    cin>>ch;
                    break;
                case '>':
                    double aa,bb;
                    bb=A.get();
                    A.pop();
                    aa=A.get();
                    A.pop();
                    A.push(oper(B.get(),aa,bb));
                    B.pop();
                    break;
                case '=':
                    B.pop();
                    if(ch==')')cin>>ch;
                    break;
                }
            if(B.top==-1)
            {
                cout<<fixed<<setprecision(2)<<A.get()<<endl;
                break;
            }
        }
    }
    return 0;
}

队列元素逆置

【问题描述】已知Q是一个非空队列,S是一个空栈。仅使用少量工作变量以及对队列和栈的基本操作,编写一个算法,将队列Q中的所有元素逆置。需采用链式队列与栈(顺序或链式),否则不能得分。

【输入形式】输入的第一行为队列元素个数,第二行为队列从首至尾的元素

【输出形式】输出队列的逆置

【样例输入】

3

1 2 3

【样例输出】

3 2 1

#include <iostream>
using namespace std;
typedef struct node
{
    int data;
    node* next;
}node,*Stack;
Stack Init()
{
    Stack s=new node;
    s->next=NULL;
    return s;
}

void push(Stack s,int n)
{
    Stack t=new  node;
    t->data=n;
    t->next=s->next;
    s->next=t;
}

void pop(Stack s)
{
    Stack p;
    int top;
    p=s->next;
    s->next=p->next;
    top=p->data;
   cout<<top<<" ";
}
int obtain(Stack s)
{
    return s->next->data;
}
int main()
{
    int x,p;
    Stack s=Init();
    cin>>x;
    for(int i=0;i<x;i++)
    {
        cin>>p;
        push(s,p);
    }
    for(int j=x;j>0;j--)
    {
        pop(s);
    }
    return 0;
}

杨辉三角形​​​​​​​

【问题描述】杨辉三角形的打印,请用循环队列实现。不采用“循环队列”,不给分。

【样例输入】

4
【样例输出】

1

1 1

1 2 1

1 3 3 1

#include <iostream>
#define M 50
using namespace std;
typedef struct
{
    int elem[M];
    int front;
    int rear;
}seqQueue,*Queue;
Queue InitQueue()
{
    Queue q;
    q=new seqQueue;
    if(q==NULL)
    {return NULL;
    }
    q->front=q->rear=0;
    return q;
}
void enterqueue(Queue q,int x)
{
    if((q->rear+1)%M==q->front)
       {
           return ;
       }
    q->elem[q->rear]=x;
    q->rear=(q->rear+1)%M;
}
 int outputqueue(Queue q)
{
    int x;
    if(q->rear==q->front)
        return 0;
    x=q->elem[q->front];
    q->front=(q->front+1)%M;
    return x;
}
int main()
{
    Queue q;
    int x=1,n;
    cin>>n;
    q=InitQueue();
    for(int i=0;i<n;i++)
    {
            if(i==0)
         {
        cout<<1<<endl;
        enterqueue(q,x);
         }
         else {
                int a=0,b=0;
                for(int k=0;k<i;k++)
                {
                    a=b;
                    b=outputqueue(q);
                    x=a+b;
                    enterqueue(q,x);
                    cout<<x<<" ";
                }
                cout<<1<<endl;
                x=1;
                enterqueue(q,x);
         }
    }
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值