栈的应用举例

来源:互联网 发布:js获取手机屏幕宽度 编辑:程序博客网 时间:2024/05/04 13:14

栈的实现(略):


一:数制转换:

扩展为:将十进制数转换为任意进制数,且由用户输入。

#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");}


Running Result:


将一个十进制数num转化的为N进制数,请输入num和N【如:10,8】1348,81348转化为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");}

Running Result:

请输入括号表达式,仅限制输入[]()这四种符号:[]()[()]([])您输入的括号表达式为:[]()[()]([])len = 100len = 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");elseprintf("匹配不成功!\n");}elseprintf("栈初始化失败!\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");}

Running Result:

请输入字符文件,以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 = '<';elset = '>';break;case '*':case '/':if (e1 == '*' || e1 == '/' || e1 == ')')t = '>';elset = '<';break;case '(':if (e1 == ')'){printf("函数括号匹配出错\n");exit(-1);}elset = '<';break;case ')':if (e1 == '(')t = '=';else{if (e1 == '='){printf("函数符号匹配出错!\n");exit(ERROR);}elset = '>';}break;case '=':if (e1 == '=')t = '=';else{if (e1 == '('){printf("函数括号匹配出错\n");exit(ERROR);}elset = '>';}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");}

Running Result:

请输入表达式【如:3*(7-2)=】:3*(7-2)=15请按任意键继续. . .


0 0
原创粉丝点击