数据结构与算法分析——c语言描述 第三章 平衡符号
平衡符号
#include"stack.h"
#include<stdio.h>
int isCorrespond(char c1, char c2) {
if (c1 == '('&&c2 == ')')
return 1;
else if (c1 == '['&&c2 == ']')
return 1;
else
return 0;
}
int main() {
FILE *fin;
Stack s = CreatStack(100);
char c,c2;
if ((fin = fopen("test.txt", "rt")) == NULL){
fprintf(stderr, "cannot open output file.\n");
return 1;
}
while ((c = getc(fin)) != EOF) {
if (c == '(' || c == '[')
Push(c,s);
else if (c == ')' || c == ']') {
c2=TopAndPop(s);
if (!isCorrespond(c2, c)) {
printf("has error%c %c\n",c2,c);
}
}
}
}
后缀表达式 中缀到后缀的转换,这两节的应用我自己合起来写了输入一个表达式计算。一开始先不管括号,很快写完了。后来实现括号功能的就想到使用递归的。但我硬是要用循环来写,结果写了一个晚上和一个早上也没有写出来。最后还是使用了递归了。。。。对了用了c++来写,c来写的话很麻烦,自己实现的栈只能使用保存一种类型,还是用c++写了。
#include<stack>
#include<stdio.h>
#include<ctype.h>
#include<string>
#include<map>
using namespace std;
#define MAXN 100
char expression[MAXN];//输入的表达式
string postfix[MAXN];//转换成的逆序表达式
int i = 0, j = 0;//i是expression的游标,postfix是逆序表达式的游标
map<char, int(*)(int, int)> operaFunc;
int _add(int x, int y) { return x + y; }
int _sub(int x, int y) { return x - y; }
int _mul(int x, int y) { return x * y; }
int _div(int x, int y) { return x / y; }
int operatorCmp(char c1, char c2);//c1为将要插入栈的运算符,c2为栈顶运算符,1表示c1优先级大于c2,0为相等,-1为小于
#define putNum() postfix[j++] = num,num.clear();//把数字输出到逆序表达式
#define putOperator() oper= operator_stack.top(),operator_stack.pop(),postfix[j++] = oper;//把符号输出到逆序表达式
void midToPostfix() {
stack<char>operator_stack;
string num;
char c, oper;
for (; expression[i] != '\0'; i++) {
c = expression[i];
if (c == '(') {
i++;
midToPostfix();
continue;
}
if (c == ')') {
break;
}
if (isdigit(c))
num += c;
else {
if (!num.empty())
putNum();
if (operator_stack.empty())
operator_stack.push(c);
else if (operatorCmp(c, operator_stack.top()) == 1) {
operator_stack.push(c);
}
else {
while (1) {
putOperator();
if (operatorCmp(c, oper) == 1 || operator_stack.empty()) {
operator_stack.push(c);
break;
}
}
}
}
}
if (!num.empty())
postfix[j++] = num;
while (!operator_stack.empty()) {
postfix[j++] = operator_stack.top();
operator_stack.pop();
}
}
int postfixToInt() {
stack<int>num_stack;
int x, y, ans;
operaFunc['+'] = _add;
operaFunc['-'] = _sub;
operaFunc['*'] = _mul;
operaFunc['/'] = _div;
for (i = 0; i < j; i++) {
if (isdigit(postfix[i][0]))
num_stack.push(stoi(postfix[i]));
else {
y = num_stack.top();
num_stack.pop();
x = num_stack.top();
num_stack.pop();
ans = operaFunc[postfix[i][0]](x, y);
num_stack.push(ans);
}
}
return num_stack.top();
}
int main() {
scanf("%s", expression);
midToPostfix();
for (int i = 0; i < j; i++) {
printf("%s", postfix[i].c_str());
}
printf("\n");
printf("%d", postfixToInt());
}
int operatorCmp(char c1, char c2) {
int t1, t2;
if (c1 == '*' || c1 == '/')
t1 = 2;
else if (c1 == '+' || c1 == '-')
t1 = 1;
if (c2 == '*' || c2 == '/')
t2 = 2;
else if (c2 == '+' || c2 == '-')
t2 = 1;
return t1 - t2;
}