您的位置:首页 > 其它

栈的应用举例

2016-03-31 23:43 211 查看
栈的实现(略):

一:数制转换:



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

#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
请按任意键继续. . .
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: