栈的实现(略):
扩展为:将十进制数转换为任意进制数,且由用户输入。
#include"head.h" void main() { SqStack s; int num, n, e; InitStack(&s); printf("将一个十进制数num转化的为N进制数,请输入num和N【如:10,8】"); scanf_s("%d, %d", &num, &n); printf("%d转化为%d进制为:", num, n); while (num) { Push(&s, num % n); num = num / n; } while (!StackEmpty(s)) { Pop(&s, &e); printf("%d", e); } printf("\n"); system("pause"); }
将一个十进制数num转化的为N进制数,请输入num和N【如:10,8】1348,8 1348转化为8进制为:2504 请按任意键继续. . .
#include"head.h" void Err_Msg() { printf("您输入的符号表达式不正确!"); system("pause"); exit(-1); } void main() { SqStack s; InitStack(&s); char brackets[100]; char ch; int len; printf("请输入括号表达式,仅限制输入[]()这四种符号:"); gets_s(brackets, _countof(brackets)); printf("您输入的括号表达式为:"); puts(brackets); //求数组的长度,方法一和自己的预期不符 len = sizeof(brackets) / sizeof(brackets[0]); printf("len = %d\n", len); //求数组的长度,方法二和自己的预期一致 len = 0; while (brackets[len] != '\0') len++; printf("len = %d\n", len); //char *p = ch; //while(*p) 没有到串尾 for (int i = 0; i < len; i++) { switch (brackets[i]) { case '[': case '(': //Puseh(&s, *p); //p++; Push(&s, brackets[i]); break; case ']': { if (StackEmpty(s)) Err_Msg(); else { Pop(&s, &ch); if (ch != '[') Err_Msg(); } break; } case ')': { if (StackEmpty(s)) Err_Msg(); else { Pop(&s, &ch); if (ch != '(') Err_Msg(); } break; } default: Err_Msg(); break; } } printf("括号达表示正确!\n"); system("pause"); }
请输入括号表达式,仅限制输入[]()这四种符号:[]()[()]([]) 您输入的括号表达式为:[]()[()]([]) len = 100 len = 12 括号达表示正确! 请按任意键继续. . .
上一个程序有bug
这是修改之后的程序:
#include"head.h" void main() { SqStack S; SElemType e; char ch[80]; char *p; if (InitStack(&S))//初始化成功 { printf("请输入括号匹配表达式:【仅限于符号\"[\"和\"(\"】"); gets_s(ch, 79); p = ch; while (*p)//没到串尾 { switch (*p) { case '(': case '[': //左括号入栈 Push(&S, *p); p++; break; case ')': case ']': if (!StackEmpty(S))//栈不为空 { Pop(&S, &e); if (((*p == ']') && (e != '[')) || ((*p == ')') && (e != '('))) { printf("括号不匹配\n"); system("pause"); exit(ERROR); } else { p++; break; } } else//栈为空时 { printf("缺左括号\n"); system("pause"); exit(ERROR); } default: p++;//其他指针不处理,指针向后移动 break; } } if (StackEmpty(S)) printf("匹配成功!\n"); else printf("匹配不成功!\n"); } else printf("栈初始化失败!\n"); system("pause"); }
三 行编辑程序
注:
1.将数据类型改为char类型,即改为typedef char SElemType;
2.将输出格式由%d改为%c,且去掉空格。
#include"head.h" void main() { SqStack s; char ch, c; InitStack(&s); printf("请输入字符文件,以ctrl+z键表示结束输入:\n"); ch = getchar(); while (ch != EOF) { //处理一行数据 while (ch != EOF && ch != '\n') { switch (ch) { case '#': Pop(&s, &c); break; case '@': ClearStack(&s); break; default: Push(&s, ch); break; } //处理下一行数据 ch = getchar(); } StackTraverse(s); ClearStack(&s); if (ch!=EOF) ch = getchar(); } DestoryStack(&s); system("pause"); }
请输入字符文件,以ctrl+z键表示结束输入: while###ile(s#*s) while(*s) ^Z 请按任意键继续. . .
四 表达式求值
使用后缀表达式。
#include"head.h" Status In(SElemType e)//判断是否为操作符 { switch (e) { case '+': case '-': case '*': case '/': case '(': case ')': case '=': return TRUE; break; default: return FALSE; break; } } //判断优先级 SElemType Precede(SElemType e1, SElemType e2) { SElemType t; switch (e2) { case '+': case '-': if (e1 == '(' || e1 == '=') t = '<'; else t = '>'; break; case '*': case '/': if (e1 == '*' || e1 == '/' || e1 == ')') t = '>'; else t = '<'; break; case '(': if (e1 == ')') { printf("函数括号匹配出错\n"); exit(-1); } else t = '<'; break; case ')': if (e1 == '(') t = '='; else { if (e1 == '=') { printf("函数符号匹配出错!\n"); exit(ERROR); } else t = '>'; } break; case '=': if (e1 == '=') t = '='; else { if (e1 == '(') { printf("函数括号匹配出错\n"); exit(ERROR); } else t = '>'; } break; } return t; } SElemType Operate(SElemType a, SElemType theta, SElemType b) { SElemType t = 0; switch (theta) { case '+': t = a + b; break; case '-': t = a - b; break; case '*': t = a*b; break; case '/': t = a / b; break; } return t; } SElemType EvaluateExpression() { SqStack OPTR, OPND;//符号栈,运算数栈 char c;//读取操作数 char z[6];//读取数值 SElemType x, t, s, a, b;//x读取运算符栈中的符号, a、b读取数字符中的数字 //t用来存储字符数组转换成的数字和运算符比较结果 int i = 0; InitStack(&OPTR); InitStack(&OPND); Push(&OPTR, '='); c = getchar(); GetTop(OPTR, &x); while (c != '=' || x != '=') { if (!In(c))//如果不是运算符 { if (c >= '0' && c <= '9') { i = 0; do { z[i] = c; i++; c = getchar(); } while (c >= '0' && c <= '9'); z[i] = 0; t = atoi(z);//将字符数组转换成整数 Push(&OPND, t); } else { printf("输入的运算数字有误!\n"); return ERROR; } } else//如果是运算符的话 { GetTop(OPTR, &x);//取出符号栈顶元素与输入符号做比较 t = Precede(x, c);//运算符做比较 switch (t) { case '<': Push(&OPTR, c); c = getchar(); break; case '=': Pop(&OPTR, &s); c = getchar(); break; case '>': Pop(&OPND, &b); Pop(&OPND, &a); Pop(&OPTR, &s); Push(&OPND, Operate(a, s, b)); break; } } GetTop(OPTR, &x); } GetTop(OPND, &t); return t; } void main() { SElemType n; printf("请输入表达式【如:3*(7-2)=】:"); n = EvaluateExpression(); printf("%d\n", n); system("pause"); }
请输入表达式【如:3*(7-2)=】:3*(7-2)= 15 请按任意键继续. . .