栈的应用举例
Posted 烽火前秦路
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了栈的应用举例相关的知识,希望对你有一定的参考价值。
栈的实现(略):
一:数制转换:
扩展为:将十进制数转换为任意进制数,且由用户输入。
#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,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");
Running Result:
请输入括号表达式,仅限制输入[]()这四种符号:[]()[()]([])
您输入的括号表达式为:[]()[()]([])
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");
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 = '<';
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");
Running Result:
请输入表达式【如:3*(7-2)=】:3*(7-2)=
15
请按任意键继续. . .
以上是关于栈的应用举例的主要内容,如果未能解决你的问题,请参考以下文章