3.2. 후위표기식 ¶
#include <iostream>
#include <stack>
using namespace std;
stack<char> Operator;
int checkPriority(char c){
switch(c){
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
case '(':
return 0;
}
}
int main() {
int i, k;
char c;
string str;
getline(cin, str);
k=str.length();
for(i=0;i<k;i++) {
c = str.at(i);
switch (c) {
case '+':
case '-':
while (!Operator.empty() && checkPriority(c)<=checkPriority(Operator.top())) {
printf("%c", Operator.top());
Operator.pop();
}
Operator.push(c);
break;
case '*':
case '/':
while (!Operator.empty() && checkPriority(c)<=checkPriority(Operator.top())) {
printf("%c", Operator.top());
Operator.pop();
}
Operator.push(c);
break;
case '(':
Operator.push(c);
break;
case ')':
while (!Operator.empty() && Operator.top() != '(') {
printf("%c", Operator.top());
Operator.pop();
}
if(!Operator.empty()){
Operator.pop();
}
break;
default:
printf("%c", c);
}
}
while (!Operator.empty()) {
printf("%c", Operator.top());
Operator.pop();
}
return 0;
}
3.3. 트리 순회 ¶
#include <stdio.h>
#include <stdlib.h>
typedef struct __Node{
char Data;
struct __Node* Left;
struct __Node* Right;
} Node;
void SetNode(Node* node, char data);
Node* SearchNode(Node* tree, char data);
void SetLeft(Node* Root, Node* Child);
void SetRight(Node* Root, Node* Child);
void DestroyTree(Node* Root);
void preorder(Node* Root);
void Inorder(Node* Root);
void Postorder(Node* Root);
int main(){
int i, j;
int N;
char Parent, Right, Left;
Node *tmp, *tmp2;
Node* Root = (Node*)malloc(sizeof(Node));
SetNode(Root, 'A');
scanf("%d", &N);
for(i=0;i<N;i++){
scanf(" %c", &Parent);
tmp = SearchNode(Root, Parent);
scanf(" %c", &Left);
if(Left!='.') {
tmp2=(Node*)malloc(sizeof(Node));
SetNode(tmp2, Left);
SetLeft(tmp, tmp2);
}
scanf(" %c", &Right);
if(Right!='.') {
tmp2=(Node*)malloc(sizeof(Node));
SetNode(tmp2, Right);
SetRight(tmp, tmp2);
}
}
preorder(Root);
printf("\n");
Inorder(Root);
printf("\n");
Postorder(Root);
printf("\n");
DestroyTree(Root);
return 0;
}
void SetNode(Node* node, char data){
node->Left=NULL;
node->Right=NULL;
node->Data = data;
}
Node* SearchNode(Node* tree, char data){
Node* tmp;
if(tree==NULL) return NULL;
if(tree->Data==data) return tree;
tmp=SearchNode(tree->Left, data);
if(tmp!=NULL) return tmp;
tmp=SearchNode(tree->Right, data);
if(tmp!=NULL) return tmp;
return NULL;
}
void DestroyTree(Node* Root){
if(Root==NULL) return;
free(Root);
DestroyTree(Root->Left);
DestroyTree(Root->Right);
}
void SetLeft(Node* Root, Node* Child){
Root->Left = Child;
}
void SetRight(Node* Root, Node* Child){
Root->Right = Child;
}
void preorder(Node* Root){
printf("%c", Root->Data);
if(Root->Left!=NULL) {
preorder(Root->Left);
}
if(Root->Right!=NULL) {
preorder(Root->Right);
}
}
void Inorder(Node* Root) {
if(Root->Left!=NULL) {
Inorder(Root->Left);
}
printf("%c", Root->Data);
if(Root->Right!=NULL) {
Inorder(Root->Right);
}
}
void Postorder(Node* Root){
if(Root->Left!=NULL) {
Postorder(Root->Left);
}
if(Root->Right!=NULL) {
Postorder(Root->Right);
}
printf("%c", Root->Data);
}










