problemscpp
A collection of my answers to algorithm problems in c++.
函数
acwing::acwing3302 命名空间参考

  1. 表达式求值
更多...

函数

int main (istream &cin, ostream &cout)
 
 TEST (acwing3302, case1)
 
 TEST (acwing3302, case2)
 
 TEST (acwing3302, case3)
 

详细描述

  1. 表达式求值

函数说明

◆ main()

int acwing::acwing3302::main ( istream &  cin,
ostream &  cout 
)

在文件 acwing.cpp6700 行定义.

6700 {
6701 stack<int> nums;
6702 stack<char> ops;
6703 char ch;
6704 int num;
6705 while((ch = cin.peek()) > 0) {
6706 if(isdigit(ch) != 0) {
6707 cin >> num;
6708 if(!ops.empty() && ops.top() == '*') {
6709 num = nums.top() * num;
6710 nums.pop();
6711 nums.push(num);
6712 ops.pop();
6713 } else if(!ops.empty() && ops.top() == '/') {
6714 num = nums.top() / num;
6715 nums.pop();
6716 nums.push(num);
6717 ops.pop();
6718 } else {
6719 nums.push(num);
6720 }
6721 } else {
6722 cin >> ch;
6723 if(ch == ')') {
6724 vector<char> vec_op;
6725 vector<int> vec_num;
6726 vec_num.push_back(nums.top());
6727 nums.pop();
6728 while(ops.top() != '(') {
6729 vec_op.push_back(ops.top());
6730 vec_num.push_back(nums.top());
6731 ops.pop();
6732 nums.pop();
6733 }
6734 ops.pop();
6735 for(int i = vec_op.size() - 1; i >= 0; --i) {
6736 if(vec_op[i] == '+') {
6737 vec_num.back() += vec_num[i];
6738 } else if(vec_op[i] == '-') {
6739 vec_num.back() -= vec_num[i];
6740 } else {
6741 return 1;
6742 }
6743 }
6744 num = vec_num.back();
6745 if(!ops.empty() && ops.top() == '*') {
6746 num = nums.top() * num;
6747 nums.pop();
6748 nums.push(num);
6749 ops.pop();
6750 } else if(!ops.empty() && ops.top() == '/') {
6751 num = nums.top() / num;
6752 nums.pop();
6753 nums.push(num);
6754 ops.pop();
6755 } else {
6756 nums.push(num);
6757 }
6758 } else {
6759 ops.push(ch);
6760 }
6761 }
6762 }
6763 vector<char> vec_op;
6764 vector<int> vec_num;
6765 vec_num.push_back(nums.top());
6766 nums.pop();
6767 while(!ops.empty()) {
6768 vec_op.push_back(ops.top());
6769 vec_num.push_back(nums.top());
6770 ops.pop();
6771 nums.pop();
6772 }
6773 for(int i = vec_op.size() - 1; i >= 0; --i) {
6774 if(vec_op[i] == '+') {
6775 vec_num.back() += vec_num[i];
6776 } else if(vec_op[i] == '-') {
6777 vec_num.back() -= vec_num[i];
6778 } else {
6779 return 1;
6780 }
6781 }
6782 cout << vec_num.back();
6783 return 0;
6784 }

被这些函数引用 TEST().

◆ TEST() [1/3]

acwing::acwing3302::TEST ( acwing3302  ,
case1   
)

在文件 acwing_test.cpp3110 行定义.

3110 {
3111 istringstream in("(2+2)*(1+1)");
3112 auto out = ostringstream();
3113 main(in, out);
3114 const auto ans = out.str();
3115 ASSERT_EQ("8", ans);
3116 }
int main(int argc, char **argv)
Definition: main.cpp:5

引用了 main().

◆ TEST() [2/3]

acwing::acwing3302::TEST ( acwing3302  ,
case2   
)

在文件 acwing_test.cpp3118 行定义.

3118 {
3119 istringstream in("(3+5*4/2+2*(1+1)*(2+2))");
3120 auto out = ostringstream();
3121 main(in, out);
3122 const auto ans = out.str();
3123 ASSERT_EQ("29", ans);
3124 }

引用了 main().

◆ TEST() [3/3]

acwing::acwing3302::TEST ( acwing3302  ,
case3   
)

在文件 acwing_test.cpp3126 行定义.

3126 {
3127 istringstream in("2*10-1000+24-(5*3)+(3*2)");
3128 auto out = ostringstream();
3129 main(in, out);
3130 const auto ans = out.str();
3131 ASSERT_EQ("-965", ans);
3132 }

引用了 main().