数据结构篇
- 向量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;
}