数据结构题C语言:栈的练习

后缀表达式

对逆波兰式(即后缀表达式)求值。其中每个操作数的取值范围为0~9,均为个位数。运算符为加减乘除四种(+、-、*、/)。如(4+5)*2-3的逆波兰式为45+2*3-。

输入说明:

一个字符串表示的逆波兰式,如:45+2*3-,表达式的长度不超过100。表达式均没有错误。

#include <stack>
#include <iostream>
using namespace std;
int main()
{//碰到操作数则入栈,碰到操作符则连续两次出栈,然后进行计算。 
	stack<char> mystack;
	int i;
	int x,y;
	char list[100]={0};
	gets(list);
	for(i=0;list[i];i++)
	{
		if(list[i]>='0'&&list[i]<='9')
			mystack.push(list[i]);
		else
		{
			
			y=mystack.top()-'0';mystack.pop();
			x=mystack.top()-'0';mystack.pop();
			if(list[i]=='+')	x=x+y;
			else if(list[i]=='-')	x=x-y;
			else if(list[i]=='*')	x=x*y;
			else	x=x/y;
			mystack.push(x+'0');
		}
	}
	x=mystack.top()-'0';
	printf("%d",x);
	return 1;
}

 前缀表达式

对前缀表达式求值,其中操作数为正整数,运算符只包含+-*/,运算结果也为整数。如(42+8)*(36-6)+9/3的前缀表达式为:+ * + 42 8 – 36 6 / 9 3。

输入说明:

输入为一行,一个字符串表示的前缀表达式,如:+ * + 42 8 – 36 6 / 9 3,表达式的长度不超过100,式中不同元素之间用空格隔开。

这个80分没有满分

//从右到左倒过来处理字符串
//碰到操作数则入栈,碰到操作符则连续两次出栈
//思路:反正从来没有存储操作符就不入了。 
//难点:数字范围是0~100,有空格 
#include <stack>
#include <iostream>
using namespace std;
int main()
{
	stack<int> mystack;
	int x,y,i;
	int len;
	char list[110]={0};
	gets(list);
	for(x=0;list[x];x++)	;
	len=x-1;

	for(i=len;i>=0;i--)
	{
		if(list[i]==' ')
			continue;
		else if(list[i]>='0'&&list[i]<='9')
		{
			if(list[i-1]>='0'&&list[i-1]<='9')
			{
				x=list[i-1]-'0';
				y=list[i]-'0';
				x=10*x+y;
				mystack.push(x);
				i--;
			}
			else
			{	x=list[i]-'0';mystack.push(x);}
		}
		else
		{
			x=mystack.top();mystack.pop();
			y=mystack.top();mystack.pop();
			if(list[i]=='+')	x=x+y;
			else if(list[i]=='-')	x=x-y;
			else if(list[i]=='*')	x=x*y;
			else	x=x/y;
			mystack.push(x);
		}
	}
	//print
	x=mystack.top();
	printf("%d",x);
	return 1;
 } 

 推荐看这一篇。XDOJ 308 前缀表达式求值_immortal5655的博客-CSDN博客

括号匹配 

 描述:

假设一个表达式或一段程序中含有三种括号:圆括号“(”和“)”、方括号“[”和“]”、花括号“{”和“}”。试写一个程序判别给定的表达式或程序中所含括号是否正确配对出现。

输入说明:

每行为一个含有括号的表达式或一段程序。 

输出说明:

输出一个right或wrong,表明正确匹配与否。

/*
思路:左括号入栈,右括号检验出栈。
失败:栈非空||左右不匹配 
*/
#include<stack>
#include<iostream> 
using namespace std;
int main()
{
	stack<char>stack;
	char list[100]={0};
	gets(list);
	int i;
	for(i=0;list[i];i++)
	{
		if(list[i]=='('||list[i]=='['||list[i]=='{')
			stack.push(list[i]);//左括号入栈 
		else if(list[i]==')'||list[i]=='}'||list[i]==']')
		{//右括号出栈 
			if(stack.size()==0)
			{
				printf("wrong");
				return 1;
			}
			if(list[i]==')')
			{
				if(stack.top()=='(')//无事发生
					stack.pop();
				else
				{
					printf("wrong");
					return 1;
				}
			}
			else if(list[i]==']')
			{
				if(stack.top()=='[')//无事发生
					stack.pop();
				else
				{
					printf("wrong");
					return 1;
				}
			}
			else
			{
				if(stack.top()=='{')//无事发生
					stack.pop();
				else
				{
					printf("wrong");
					return 1;
				}
			}
		}
		else	continue;
	}
	if(stack.size())
		printf("wrong");
	else
		printf("right");
	return 1;	
}

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
西南交通大学的考研数据结构C语言主要涵盖了数据结构C语言的基本概念、常见算法和数据结构的应用,是考研复习中的重点和难点。 数据结构部分的真主要涉及线性表、和队列、链表和树、图和排序等知识点。例如,可能会出现关于数组的插入、删除和查找操作以及对其时间复杂度的分析目,还可能会要求设计和实现单链表、二叉树或图等数据结构,并进行相应的操作和应用。对于这些目,考生需要熟悉各种数据结构的特点、使用方法和算法,能够分析算法的时间复杂度和空间复杂度,并灵活应用到实际问中。 C语言部分的真主要考察C语言的基本语法、指针和内存管理、函数和库等方面的知识。可能会出现关于函数的声明和定义、指针的使用、内存动态分配和释放等方面的目。考生需要对C语言的语法、特性和常用库函数有一定的掌握,能够理解和分析C语言程序的执行过程和内存管理机制。 对于准备西南交通大学考研的考生来说,要复习数据结构C语言,首先要掌握基础概念和常用算法和数据结构的原理和应用。其次,要多做真和模拟,加深对知识的理解和应用。同时,还要关注最新的考研动态和备考资料,及时调整和完善复习计划。通过系统的学习和不断的练习,相信考生一定能够顺利应对西南交通大学考研数据结构C语言的考试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值