前言
本次数据结构入门训练主要训练到以下内容:
- 学习了栈的入栈和出栈操作
- 学习了STL库的stack
- 训练解题思维
一、题目
将十进制数转换为八进制,并输出。
样例输入
1 2 3 7 8 9 19 10020345
样例输出
1 2 3 7 10 11 23 46162771
二、解题思路
今天的题目是一道很基础的对于栈的基本操作的题目,十分适合新手练习。我用了两种办法解决它;第一种是使用结构体创建一个栈的结构,然后建立空栈函数,再分别建立入栈函数,出栈函数;由于题目需要,所以我还建立了对应进制转换的函数。然后按照要求在主函数调用即可。第二种是使用STL配合vector的方法,由于它库函数包含了push和pop,我们只要调用即可。
第一种方法的代码:
#include <bits/stdc++.h>
using namespace std;
long long num = 0, sum = 0, b = 1, x = 1;
typedef long long SElemType;
typedef struct SqStack {//创建栈的结构体
SElemType e;
struct SqStack *next;
} SqStack;
void InitStack(SqStack* &S) {//创建空栈
S = nullptr;
}
void Push(SqStack* &S, SElemType e) {//入栈操作
SqStack* newNode = new SqStack;
newNode->e = e;
newNode->next = S;
S = newNode;
}
bool Pop(SqStack* &S, SElemType &e) {//出栈操作
if (S == nullptr) {
return false;
}
SqStack* temp = S;
e = temp->e;
S = S->next;
delete temp;
return true;
}
bool SqStackEmpty(SqStack* S) {//判断是否为空栈
return S == nullptr;
}
void conversion(long long Num) {//十进制转八进制
SElemType e;
SqStack* S;
InitStack(S);
if (Num == 0) {
cout << 0 << endl;
return;
}
while (Num != 0) {
Push(S, Num % 8);
Num /= 8;
}
while (!SqStackEmpty(S)) {
Pop(S, e);
cout << e;
}
cout << endl;
}
int main() {
while(cin >> num){
conversion(num);
}
return 0;
}
第二种方法的代码:
#include <bits/stdc++.h>
using namespace std;
void conversion(long long Num) {
if (Num == 0) {
cout << 0 << endl;
return;
}
vector<int> stack;//vector中建立栈
while (Num != 0) {
stack.push_back(Num % 8);//入栈
Num /= 8;
}
while (!stack.empty()) {
cout << stack.back();
stack.pop_back();//出栈
}
cout << endl;
}
int main() {
long long n;
while (cin >> n) {
conversion(n);
}
return 0;
}
总结
今天的题目很好的让我练习了栈的操作,让我重新回顾了入栈操作和出栈操作的知识,刚开始我忘记了这俩方法的核心部分,然后去查找了相关文章,然后通过题目的要求改出来了正确答案;后续栈的知识巩固学习可以通过今天的学习为基础,继续深入练习。