数据结构实验3
实验.cpp
1 //编写程序,实现顺序栈的基本运算:初始化ok、入栈ok、出栈ok; 2 //应用顺序栈实现数制转换:把任意非负十进制正整数转换为n(n可以为2、8、16等等)进制数输出ok,给出至少5组测试数据及结果。; 3 //应用顺序栈,编程实现表达式(只包含 + 、 - 、 * 、 / 四种运算符及左右圆括号,操作数为整数)的计算;至少给出3组测试数据及结果。 4 //编写程序,实现循环队列的基本运算:初始化、入队、出队。 5 6 7 #include<iostream> 8 #include<cstdio> 9 using namespace std; 10 11 #define MAX 100 12 13 //定义数据类型 14 typedef int DataType; 15 //栈的定义 16 typedef struct 17 { 18 DataType data[MAX]; //顺序栈的存储类型 19 int top; //记录栈顶的指针,在顺序栈中类似于数组下标 20 }Seqstack; 21 22 //栈的初始化 23 void InitStack(Seqstack* s) 24 { 25 s->top = -1; //初始化栈顶指针为-1 26 } 27 28 //判断栈是否为空 29 int EmptyStack(Seqstack* s) 30 { 31 if (s->top == -1) 32 return 1; //若空返回1,非空返回0 33 else 34 return 0; 35 } 36 37 //判断栈是否已满 38 int FullStack(Seqstack* s) 39 { 40 if (s->top == MAX - 1) 41 return 1; //若满返回1,非空返回0 42 else 43 return 0; 44 } 45 46 //入栈 47 int Push(Seqstack* s, DataType x) 48 { 49 if (FullStack(s)) //调用函数判断栈是否已满 50 { 51 printf("栈满,不可入栈!"); 52 return 0; 53 } 54 else 55 { 56 s->top++; //将栈顶指针上一位 57 s->data[s->top] = x; 58 return 1; 59 } 60 } 61 62 //出栈 63 int Pop(Seqstack* s, DataType* x) 64 { 65 if (EmptyStack(s)) 66 { 67 return 0; 68 } 69 else 70 { 71 *x = s->data[s->top]; 72 s->top--; 73 return 1; 74 } 75 } 76 77 //出栈并输出栈中元素 78 void printStack(Seqstack* s) 79 { 80 DataType e; 81 //cout << "栈中元素有:"; 82 while (Pop(s, &e)) 83 printf("%d ", e); 84 cout << endl; 85 } 86 87 void OutputStack(Seqstack* S) 88 { 89 cout << "栈中元素有:"; 90 for (int i = S->top; i >= 0; i--) 91 cout << S->data[i]; 92 cout << endl; 93 } 94 95 void ChangeStack(DataType e, int con) { 96 string s; 97 // 处理 e 为 0 的情况 98 if (e == 0) { 99 s.push_back('0'); 100 } 101 // 十进制转换为目标进制 102 while (e) { 103 char digit = (e % con) + '0'; 104 if (digit > '9') { 105 digit = digit - '0' + 'A'; // 转换为 A, B, C 等十六进制字符 106 } 107 s.push_back(digit); 108 e /= con; 109 } 110 // 反转字符串 111 reverse(s.begin(), s.end()); 112 cout << s << endl; 113 } 114 115 void ConvertStack(Seqstack* S, int con) { 116 for (int i = 0; i <= S->top; i++) { 117 DataType e = S->data[i]; 118 ChangeStack(e, con); 119 } 120 } 121 122 void Menu() 123 { 124 puts("****************"); 125 puts("1.初始化"); 126 puts("2.判断栈为空"); 127 puts("3.入栈"); 128 puts("4.出栈"); 129 puts("5.取栈顶元素"); 130 puts("6.把栈中元素转换进制"); 131 puts("0.程序结束"); 132 puts("****************"); 133 } 134 135 int main() 136 { 137 Seqstack S; 138 int choice = -1,num,n; 139 DataType e; 140 Menu(); 141 while (choice == -1) 142 { 143 cout << "你的选择是:"; 144 cin >> num; 145 cout << endl; 146 switch (num) 147 { 148 case 1: 149 InitStack(&S); 150 cout << "初始化完成!\n"; 151 break; 152 case 2: 153 if (EmptyStack(&S)) 154 cout << "栈为空!\n"; 155 else 156 cout << "栈不为空!\n"; 157 break; 158 case 3: 159 cout << "请输入入栈的数量:"; 160 cin >> n; 161 cout << endl; 162 cout << "输入入栈的元素:"; 163 for (int i = 0; i < n; i++) 164 { 165 scanf("%d", &e); 166 Push(&S, e); 167 } 168 break; 169 case 4: 170 cout << "输出栈中元素:"; 171 //Pop(&S, &e); 172 printStack(&S); 173 //cout << endl; 174 break; 175 case 5: 176 cout << "栈顶元素为:"; 177 if (Pop(&S, &e)) 178 cout << e; 179 else 180 cout << "栈为空!"; 181 cout << endl; 182 break; 183 case 6: 184 cout << "输入转换的进制:"; 185 int con; 186 cin >> con; 187 ConvertStack(&S, con); 188 break; 189 case 0: 190 choice = 0; 191 break; 192 default:printf("选择有误请重新输入!\n"); 193 } 194 } 195 return 0; 196 }
二则运算.cpp
1 #include <iostream> 2 #include <stack> 3 #include <string> 4 #include <cctype> // for isdigit function 5 6 using namespace std; 7 8 // 运算符优先级函数 9 int getPriority(char op) { 10 if (op == '+' || op == '-') return 1; 11 if (op == '*' || op == '/') return 2; 12 return 0; 13 } 14 15 // 执行简单的二元运算 16 int applyOperator(int left, int right, char op) { 17 switch (op) { 18 case '+': return left + right; 19 case '-': return left - right; 20 case '*': return left * right; 21 case '/': return left / right; 22 default: return 0; 23 } 24 } 25 26 // 计算表达式 27 int calculateExpression(const string& expr) { 28 stack<int> values; // 存储操作数 29 stack<char> ops; // 存储运算符 30 31 int n = expr.size(); 32 for (int i = 0; i < n; ++i) { 33 // 跳过空格 34 if (isspace(expr[i])) continue; 35 36 // 如果是数字,处理多位数 37 if (isdigit(expr[i])) { 38 int val = 0; 39 while (i < n && isdigit(expr[i])) { 40 val = val * 10 + (expr[i] - '0'); 41 ++i; 42 } 43 --i; // 由于循环后 i 会多加 1,需要回退 44 values.push(val); 45 } 46 // 如果是左括号,压入运算符栈 47 else if (expr[i] == '(') { 48 ops.push(expr[i]); 49 } 50 // 如果是右括号,计算直到遇到左括号 51 else if (expr[i] == ')') { 52 while (!ops.empty() && ops.top() != '(') { 53 int right = values.top(); values.pop(); 54 int left = values.top(); values.pop(); 55 char op = ops.top(); ops.pop(); 56 values.push(applyOperator(left, right, op)); 57 } 58 ops.pop(); // 弹出 '(' 59 } 60 // 如果是运算符 61 else if (expr[i] == '+' || expr[i] == '-' || expr[i] == '*' || expr[i] == '/') { 62 while (!ops.empty() && getPriority(ops.top()) >= getPriority(expr[i])) { 63 int right = values.top(); values.pop(); 64 int left = values.top(); values.pop(); 65 char op = ops.top(); ops.pop(); 66 values.push(applyOperator(left, right, op)); 67 } 68 ops.push(expr[i]); 69 } 70 } 71 72 // 处理栈中剩余的运算符 73 while (!ops.empty()) { 74 int right = values.top(); values.pop(); 75 int left = values.top(); values.pop(); 76 char op = ops.top(); ops.pop(); 77 values.push(applyOperator(left, right, op)); 78 } 79 80 return values.top(); // 栈顶就是最终结果 81 } 82 83 int main() { 84 // 测试用例 85 string expr1 = "3 + 2 * 2"; // 7 86 string expr2 = "(1 + 2) * 3 + 4"; // 11 87 string expr3 = "3 + 5 / 2"; // 5 88 89 cout << "Expression: " << expr1 << " = " << calculateExpression(expr1) << endl; 90 cout << "Expression: " << expr2 << " = " << calculateExpression(expr2) << endl; 91 cout << "Expression: " << expr3 << " = " << calculateExpression(expr3) << endl; 92 93 return 0; 94 } 95 #include <iostream> 96 #include <stack> 97 #include <string> 98 #include <cctype> // for isdigit function 99 100 using namespace std; 101 102 // 运算符优先级函数 103 int getPriority(char op) { 104 if (op == '+' || op == '-') return 1; 105 if (op == '*' || op == '/') return 2; 106 return 0; 107 } 108 109 // 执行简单的二元运算 110 int applyOperator(int left, int right, char op) { 111 switch (op) { 112 case '+': return left + right; 113 case '-': return left - right; 114 case '*': return left * right; 115 case '/': return left / right; 116 default: return 0; 117 } 118 } 119 120 // 计算表达式 121 int calculateExpression(const string& expr) { 122 stack<int> values; // 存储操作数 123 stack<char> ops; // 存储运算符 124 125 int n = expr.size(); 126 for (int i = 0; i < n; ++i) { 127 // 跳过空格 128 if (isspace(expr[i])) continue; 129 130 // 如果是数字,处理多位数 131 if (isdigit(expr[i])) { 132 int val = 0; 133 while (i < n && isdigit(expr[i])) { 134 val = val * 10 + (expr[i] - '0'); 135 ++i; 136 } 137 --i; // 由于循环后 i 会多加 1,需要回退 138 values.push(val); 139 } 140 // 如果是左括号,压入运算符栈 141 else if (expr[i] == '(') { 142 ops.push(expr[i]); 143 } 144 // 如果是右括号,计算直到遇到左括号 145 else if (expr[i] == ')') { 146 while (!ops.empty() && ops.top() != '(') { 147 int right = values.top(); values.pop(); 148 int left = values.top(); values.pop(); 149 char op = ops.top(); ops.pop(); 150 values.push(applyOperator(left, right, op)); 151 } 152 ops.pop(); // 弹出 '(' 153 } 154 // 如果是运算符 155 else if (expr[i] == '+' || expr[i] == '-' || expr[i] == '*' || expr[i] == '/') { 156 while (!ops.empty() && getPriority(ops.top()) >= getPriority(expr[i])) { 157 int right = values.top(); values.pop(); 158 int left = values.top(); values.pop(); 159 char op = ops.top(); ops.pop(); 160 values.push(applyOperator(left, right, op)); 161 } 162 ops.push(expr[i]); 163 } 164 } 165 166 // 处理栈中剩余的运算符 167 while (!ops.empty()) { 168 int right = values.top(); values.pop(); 169 int left = values.top(); values.pop(); 170 char op = ops.top(); ops.pop(); 171 values.push(applyOperator(left, right, op)); 172 } 173 174 return values.top(); // 栈顶就是最终结果 175 } 176 177 int main() { 178 // 测试用例 179 string expr1 = "3 + 2 * 2"; // 7 180 string expr2 = "(1 + 2) * 3 + 4"; // 11 181 string expr3 = "3 + 5 / 2"; // 5 182 183 cout << "Expression: " << expr1 << " = " << calculateExpression(expr1) << endl; 184 cout << "Expression: " << expr2 << " = " << calculateExpression(expr2) << endl; 185 cout << "Expression: " << expr3 << " = " << calculateExpression(expr3) << endl; 186 187 return 0; 188 }
队列.cpp
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #include<stdbool.h> 5 #include<assert.h> 6 7 typedef int QDateType; 8 typedef struct QueueNode 9 { 10 struct QueueNode* next; 11 QDateType date; 12 }QNode; 13 typedef struct Queue 14 { 15 QNode* head; 16 QNode* tail; 17 }Queue; 18 19 #define _CRT_SECURE_NO_WARNINGS 1 20 //队列的初始化 21 void QueueInit(Queue* pq) 22 { 23 assert(pq); 24 pq->head = NULL; 25 pq->tail = NULL; 26 } 27 //队列的销毁 28 void QueueDestory(Queue* pq) 29 { 30 assert(pq); 31 32 QNode* cur = pq->head; 33 while (cur) 34 { 35 QNode* next = cur->next; 36 free(cur); 37 cur = next; 38 } 39 pq->head = pq->tail = NULL; 40 } 41 //队列的插入 42 void QueuePush(Queue* pq, QDateType x) 43 { 44 assert(pq); 45 QNode* newnode = (QNode*)malloc(sizeof(QNode)); 46 if (newnode == NULL) 47 { 48 printf("malloc is fail\n"); 49 exit(-1); 50 } 51 //对新节点进行初始化 52 newnode->date = x; 53 newnode->next = NULL; 54 55 //对新结点进行连接 56 if (pq->head == NULL) 57 { 58 //头结点是空的,也就是第一个数据的插入 59 pq->head = pq->tail = newnode; 60 } 61 else 62 { 63 //非第一个数据的插入 64 pq->tail->next = newnode; 65 pq->tail = newnode; 66 } 67 } 68 //队列的删除 69 void QueuePop(Queue* pq) 70 { 71 assert(pq); 72 //确保队列不是空的队列 73 assert(pq->head); 74 //如果只有一个结点,防止tail形成野指针 75 if (pq->head->next == NULL) 76 { 77 free(pq->head); 78 pq->head = pq->tail = NULL; 79 } 80 //不是只有一个结点 81 else 82 { 83 //保存第二个队列结点 84 QNode* next = pq->head->next; 85 free(pq->head); 86 pq->head = next; 87 } 88 } 89 //判断队列是否为空 90 bool QueueEmpty(Queue* pq) 91 { 92 assert(pq); 93 return pq->head == NULL; 94 } 95 //取出队头的数据 96 QDateType QueueFront(Queue* pq) 97 { 98 assert(pq); 99 assert(pq->head); 100 return pq->head->date; 101 } 102 //取出队尾的数据 103 QDateType QueueBack(Queue* pq) 104 { 105 assert(pq); 106 assert(pq->head); 107 return pq->tail->date; 108 } 109 //取出数据的个数 110 int QueueSize(Queue* pq) 111 { 112 assert(pq); 113 int size = 0; 114 QNode* cur = pq->head; 115 while (cur) 116 { 117 cur = cur->next; 118 size++; 119 } 120 return size; 121 } 122 123 void TestQueue() 124 { 125 Queue q; 126 QueueInit(&q); 127 QueuePush(&q, 1); 128 QueuePush(&q, 2); 129 QueuePush(&q, 3); 130 QueuePush(&q, 4); 131 QueuePush(&q, 5); 132 133 while (!QueueEmpty(&q)) 134 { 135 printf("%d ", QueueFront(&q)); 136 QueuePop(&q); 137 } 138 printf("\n"); 139 QueueDestory(&q); 140 } 141 int main() 142 { 143 TestQueue(); 144 return 0; 145 }