栈的应用举例

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qianqin_2014/article/details/51031090

栈的实现(略):


一:数制转换:

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

#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
请按任意键继续. . .



展开阅读全文

没有更多推荐了,返回首页