【数据结构】第五周

目录

进制转换问题

字符串镜像

表达式求值

队列元素逆置

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


进制转换问题

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

#include
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<>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
using namespace std;
#include
#include

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<

表达式求值

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

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

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

【样例输入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 
using namespace std;
template 
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 A;
        mstack 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<

队列元素逆置

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

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

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

【样例输入】

3

1 2 3

【样例输出】

3 2 1

#include 
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<next->data;
}
int main()
{
    int x,p;
    Stack s=Init();
    cin>>x;
    for(int i=0;i>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 
#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

你可能感兴趣的:(数据结构)