王道复试机试(4)

数据结构篇

  • 向量vector
    在空间溢出发生后,会扩两倍空间
	int myArray[]={1,2,3,4,5};
	
	vector<int > v1;
	vector<int > v2(myArray+0,myArray+5); // 1 2 3 4 5
	vector<int > v3(5,2); //2 2 2 2 2
	vector<int > v4(v2);
	vector<int > v5(v4.begin(),v4.begin()+3);

操作:

	int a[]={1,2,3,4,5};
	vector<int > v(a,a+5);
	int n= v.size();// 获取vector的长度
	v.pop_back(); // 尾部弹出 1,2,3,4
	v.push_back(6); // 尾部推入 1 2 3 4 6
	v.insert(v.begin()+1,9); // 1 9 2 3 4 6
	v.insert(v.begin(),3,7); // 7 7 7 1 9 2 3 4 6
	v.insert(v.begin(),a,a+2); // 1 2 7 7 7 1 9 2 3 4 6
	v.erase(v.begin()+6); //删除特定值 1 2 7 7 7 1 2 3 4 6 
	v.erase(v.begin()+1,v.begin()+3); // 1 7 1 2 3 4 6
	v.clear(); //置空 
  • 队列queue(先进先出) 队尾进入,队头出去
#include<iostream>
#include<cstdio>
#include<queue>

using namespace std;

int main()
{
	queue<int> q;
	
	for(int i=0; i<10; ++i)
	{
		q.push(i);
	}
	int sum=0;
	while(!q.empty()) // 判空 ture 
	{
		sum+= q.front(); // 访问队头 
		q.pop(); // 出队,弹出队首 
	}
	printf("%d\n",sum);
	return 0; 
}
  • 栈stack(后入先出)
#include<iostream>
#include<cstdio>
#include<stack>

using namespace std;
int main()
{
	stack<int > s;
	
	for(int i=0;i<10;i++)
	{
		s.push(i);
	}
	int sum=0;
	while(!s.empty())
	{
		printf("%d",s.top()); //访问栈顶
		sum+=s.top();
		s.pop(); // 弹出栈顶元素 
	}
	printf("%d\n",sum);
	return 0;
}

关于栈的应用:
1.逆序输出(利用栈的特性,后进先出)
2.括号匹配(一般匹配是左右括号匹配,从左往右最近距离匹配,如果左括号不能匹配则用$,右括号?来重新输出一个字符串)

#include<iostream>
#include<cstdio>
#include<string>
#include<stack>

using namespace std;
int main()
{
	string str;
	while(cin>>str)
	{
		stack<int > brackets; // 用栈来存取左括号的位置 
		string answer(str.size(),' '); // 给一个新字符串赋予等同str长度的空间 
		for(int i=0; i<str.size(); ++i) //遍历需要检查的字符串 
		{
			if(str[i]=='(') // 左括号压入 
			{
				brackets.push(i);
			}
			else if(str[i]==')')
			{
				if(brackets.empty()) //如果栈中为空 即前面没有与之匹配的左括号,右括号判定为失配 
				{
					answer[i]='?';
				}
				else // 栈中有元素,弹出元素,即与右括号就近匹配的左括号 
				{
					brackets.pop(); //弹出所匹配的左括号 
				}
			}
		}
		while(!brackets.empty()) // 此时不一定栈中的左括号都有右括号进行匹配,剩余的即为失配的左括号 
		{
			answer[brackets.top()]='$';
			brackets.pop();
		}
		cout<<str<<endl;
		cout<<answer<<endl; 
	} 
	return 0;
}

3.简单计算器
①从左往右 1*2/3 1-2+3
②乘除法 > 加减法

思想: 左<当前优先级>=右
用符号栈和运算数栈

#include<iostream>
#include<cstdio>
#include<string>
#include<cctype>
#include<stack>

using namespace std;
int Priority(char c)
{
	if(c=='#')
		return 0;
	else if(c=='$')
		return 1;
	else if(c=='+'||c=='-')
		return 2;
	else
		return 3;
}
double GetNumber(string str,int &index) // 在字符串中将字符串转为数字 
{
	double number=0;
	while(isdigit(str[index]))
	{
		number=number*10+str[index]-'0';
		index++;
	}
	return number;
}
double cal(double x, double y, char op)
{
	double result=0;
	if(op=='+')
		result =x+y;
	else if(op=='-')
		result =x-y;
	else if(op=='*')
		result =x*y;
	else if(op=='/')
		result==x/y;
		
	return result;
} 
int main()
{
	string str;
	while(getline(cin,str))
	{
		if(str=="0")
			break;
		int index=0;
		stack<char > oper;
		stack<double> data;
		
		oper.push('#');
		str+='$';
		while(index<str.size()) //字符串遍历 
		{
			if(str[index]==' ')
			{
				index++;
			}
			else if(isdigit(str[index])) //str中是字符 
			{
				data.push(GetNumber(str,index)); 
			}
			else
			{
				if(Priority(oper.top())<Priority(str[index]))
				{
					oper.push(str[index]);
					index++;
				}
				else
				{
					double y= data.top();
					data.pop();
					double x= data.top();
					data.pop();
					data.push(cal(x,y,oper.top()));
					oper.pop();
				}
			}
		}
	printf("%.2f\n",data.top()); 
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值