目录
进制转换问题
字符串镜像
表达式求值
队列元素逆置
杨辉三角形
【问题描述】根据课堂讲授,请用“顺序栈”解决进制转换问题,不采用顺序栈,不给分。
【输入形式】十进制数据和待转换的进制
【输出形式】转换后的数据
【样例输入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”则不是。 【输入形式】 【输出形式】 【样例输入】 【样例输出】 【注意】本题务必使用顺序栈或者链式栈的一种来实现,否则不给分。 |
//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