栈的应用举例

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



以上是关于栈的应用举例的主要内容,如果未能解决你的问题,请参考以下文章

数据结构(C语言) 栈的应用之数制转换

第三章:2.栈和队列 -- 栈的应用举例

栈的应用

栈及其应用

数据结构——栈 (链栈和基于Java的运算实现)

数据结构算法C语言实现--- 3.2栈的应用举例:迷宫求解与表达式求值