//将表达式转化成逆波兰式
	vector<string> convertToRPN(const string& s) {
		vector<string> retVec;	//要返回的vector,里面的元素构成逆波兰式
		stack<char> operatorStack;	//存放操作符的栈
		operatorStack.push('\0');	//首先将\0入栈,否则如果表达式第一个就是操作符,那么就无法与栈中的元素比较
		string::size_type sz = 0;
		while (sz != s.size()) {
			if (isdigit(s[sz])) {	//如果是数字,那么直接放到逆波兰式中
				retVec.push_back(string(&s[sz], 1));
				++sz; //看接下来的元素
			}
			else {	//如果是操作符,那么与栈中的操作符比较
				char op = comparePriority(operatorStack.top(), s[sz]);
				switch (op) {
                    case '<': {		//如果栈中的操作符大,那么元素入栈,看接下来的元素
                        operatorStack.push(s[sz]);
                        ++sz;
                        break;
                    }
                    case '=': {		//如果相等,这说明栈中是左括号,元素是右括号,它们都不用放入逆波兰式
                        operatorStack.pop();
                        ++sz;
                        break;
                    }
                    case '>': {		//如果栈中的操作符大,说明要先计算栈中的操作符,所以将它弹出放到逆波兰式中,注意,这里sz不增加,因为还要
                    				//比较当前元素与新栈顶的元素优先级
                        string op = string(&operatorStack.top(), 1);
                        retVec.push_back(op);
                        operatorStack.pop();
                        break;
                    }
                    default:
                        exit(-1);
				}
			}
		}	
		while (!operatorStack.empty()) {	//现在我们已经都将所有元素比较好了,如果栈中还有元素,就要依次的放入逆波兰式中
			retVec.push_back(string(&operatorStack.top(), 1));	
			operatorStack.pop();
		}
		retVec.erase(retVec.begin() + retVec.size() - 1);	//注意,由于开始放入了\0,最后要讲它从逆波兰式中去除
		return retVec;
	}
示例#2
0
void test_compare_priority_list_element_smaller_shouled_return_1(void){
  int result;
  TCB list = {.priority = 1};
  TCB insert = {.priority = 2};
  
  result = comparePriority(&list, &insert);
  
  TEST_ASSERT_EQUAL(1, result);
}

void test_compare_priority_list_element_larger_should_return_0(void){
  int result;
  TCB list = {.priority = 2};
  TCB insert = {.priority = 1};
  
  result = comparePriority(&list, &insert);
  
  TEST_ASSERT_EQUAL(0, result);
}

void test_compare_priority_list_element_same_priority_should_return_0(void){
  int result;
  TCB list = {.priority = 1};
  TCB insert = {.priority = 1};
  
  result = comparePriority(&list, &insert);
  
  TEST_ASSERT_EQUAL(result, 0);
}

void test_removeFromHeadPriorityLinkedList_TCB1_should_be_removed_TCB2_should_be_head(){
  PriorityLinkedList list;
  TCB *removedElement;
  createPriorityLinkedList(&list);
  
  TCB TCB2 = {.next = NULL, .priority = 2};
  TCB TCB1 = {.next = &TCB2, .priority = 1};
  
  list.head = &TCB1;
  list.tail = &TCB2;
  
  removedElement = removeFromHeadPriorityLinkedList(&list);
  
  TEST_ASSERT_EQUAL(list.head, &TCB2);
  TEST_ASSERT_EQUAL(list.tail, &TCB2);
  TEST_ASSERT_EQUAL(removedElement, &TCB1);
  
  
}

void test_removeFromHeadPriorityLinkedList_TCB1_should_be_removed_head_should_be_null(){
  PriorityLinkedList list;
  TCB *removedElement;
  createPriorityLinkedList(&list);
  
  TCB TCB1 = {.next = NULL, .priority = 1};
  
  list.head = &TCB1;
  list.tail = &TCB1;
  
  removedElement = removeFromHeadPriorityLinkedList(&list);
  
  TEST_ASSERT_NULL(list.head);
  TEST_ASSERT_NULL(list.tail);
  TEST_ASSERT_EQUAL(removedElement, &TCB1);
  
}

void test_removeFromHeadPriorityLinkedList_TCB1_TCB2_should_be_removed_TCB3_should_be_head(){
  PriorityLinkedList list;
  TCB *removedElement;
  createPriorityLinkedList(&list);
  
  TCB TCB3 = {.next = NULL, .priority = 1};
  TCB TCB2 = {.next = &TCB3, .priority = 2};
  TCB TCB1 = {.next = &TCB2, .priority = 3};
  
  list.head = &TCB1;
  list.tail = &TCB3;
  
  removedElement = removeFromHeadPriorityLinkedList(&list);
  TEST_ASSERT_EQUAL(&TCB1, removedElement);
  TEST_ASSERT_EQUAL(&TCB2, list.head);
  TEST_ASSERT_EQUAL(&TCB3, list.head->next);
  TEST_ASSERT_EQUAL(&TCB3, list.tail);
  
  removedElement = removeFromHeadPriorityLinkedList(&list);
  TEST_ASSERT_EQUAL(&TCB2, removedElement);
  TEST_ASSERT_EQUAL(&TCB3, list.head);
  TEST_ASSERT_EQUAL(&TCB3, list.tail);
  TEST_ASSERT_EQUAL(NULL, list.head->next);
  
}

void test_removeFromHeadPriorityLinkedList_TCB1_TCB2_TCB3_should_be_removed(){
  PriorityLinkedList list;
  TCB *removedElement;
  createPriorityLinkedList(&list);
  
  TCB TCB3 = {.next = NULL, .priority = 1};
  TCB TCB2 = {.next = &TCB3, .priority = 2};
  TCB TCB1 = {.next = &TCB2, .priority = 3};
  
  list.head = &TCB1;
  list.tail = &TCB3;
  
  removedElement = removeFromHeadPriorityLinkedList(&list);
  TEST_ASSERT_EQUAL(&TCB1, removedElement);
  TEST_ASSERT_EQUAL(&TCB2, list.head);
  TEST_ASSERT_EQUAL(&TCB3, list.head->next);
  TEST_ASSERT_EQUAL(&TCB3, list.tail);
  
  removedElement = removeFromHeadPriorityLinkedList(&list);
  TEST_ASSERT_EQUAL(&TCB2, removedElement);
  TEST_ASSERT_EQUAL(&TCB3, list.head);
  TEST_ASSERT_EQUAL(&TCB3, list.tail);
  TEST_ASSERT_EQUAL(NULL, list.head->next);  

  removedElement = removeFromHeadPriorityLinkedList(&list);
  TEST_ASSERT_EQUAL(&TCB3, removedElement);
  TEST_ASSERT_NULL(list.head);
  TEST_ASSERT_NULL(list.tail);
    
}

void test_addPriorityLinked_TCB1_into_empty_list(){
  PriorityLinkedList list;
  createPriorityLinkedList(&list);
  

  TCB TCB1 = {.next = NULL, .priority = 1};

  list.head = NULL;
  list.tail = NULL;

  addPriorityLinkedList(&list, &TCB1, comparePriority);

  TEST_ASSERT_NOT_NULL(list.head);
  TEST_ASSERT_NOT_NULL(list.tail);
  

}

void test_addPriorityLinked_lower_priority_TCB1_into_list(){
  PriorityLinkedList list;
  createPriorityLinkedList(&list);  
  
  TCB TCB1 = {.next = NULL, .priority = 1};
  TCB TCB2 = {.next = NULL, .priority = 20};

  list.head = &TCB2;
  list.tail = &TCB2;
  
  addPriorityLinkedList(&list, &TCB1, comparePriority);

  TEST_ASSERT_EQUAL(list.head, &TCB2);
  TEST_ASSERT_EQUAL(list.tail, &TCB1);
  TEST_ASSERT_EQUAL(TCB2.next, &TCB1);
  TEST_ASSERT_NULL(TCB1.next);
  
}

void test_addPriorityLinked_lower_priority_TCB3_into_list(){
  PriorityLinkedList list;
  createPriorityLinkedList(&list);
  
  TCB TCB3 = {.next = NULL, .priority = 20};
  TCB TCB2 = {.next = NULL, .priority = 20};
  TCB TCB1 = {.next = NULL, .priority = 20};

  list.head = &TCB1;
  list.tail = &TCB1;
  
  addPriorityLinkedList(&list, &TCB2, comparePriority);
  addPriorityLinkedList(&list, &TCB3, comparePriority);

  TEST_ASSERT_EQUAL(list.head, &TCB1);
  TEST_ASSERT_EQUAL(list.tail, &TCB3);
  TEST_ASSERT_EQUAL(TCB1.next, &TCB2);
  TEST_ASSERT_EQUAL(TCB2.next, &TCB3);
  TEST_ASSERT_NULL(TCB3.next);
  
}

void test_addPriorityLinked_higher_priority_TCB1_into_list(){
  PriorityLinkedList list;
  createPriorityLinkedList(&list);
  
  TCB TCB1 = {.next = NULL, .priority = 40};
  TCB TCB2 = {.next = NULL, .priority = 20};

  list.head = &TCB2;
  list.tail = &TCB2;

  addPriorityLinkedList(&list, &TCB1, comparePriority);
  TEST_ASSERT_EQUAL(&TCB1, list.head);
  TEST_ASSERT_EQUAL(&TCB2, list.tail);
  TEST_ASSERT_EQUAL(&TCB2, TCB1.next);
  TEST_ASSERT_NULL(TCB2.next);
  
}

void test_addPriorityLinked_inbetween_priority_TCB1_into_list(){
  PriorityLinkedList list;
  createPriorityLinkedList(&list);
  
  TCB TCB3 = {.next = NULL, .priority = 20};
  TCB TCB2 = {.next = &TCB3, .priority = 50};
  TCB TCB1 = {.next = NULL, .priority = 40};

  list.head = &TCB2;
  list.tail = &TCB3;

  addPriorityLinkedList(&list, &TCB1, comparePriority);
  TEST_ASSERT_EQUAL(&TCB2, list.head);
  TEST_ASSERT_EQUAL(&TCB3, list.tail);
  TEST_ASSERT_EQUAL( &TCB1, TCB2.next);
  TEST_ASSERT_EQUAL(&TCB3, TCB1.next);
  TEST_ASSERT_NULL(TCB3.next);
  
}

void test_addPriorityLinked_add_same_priority_TCB3_into_list(){
  PriorityLinkedList list;
  createPriorityLinkedList(&list);
  
  TCB TCB3 = {.next = NULL, .priority = 0};
  TCB TCB2 = {.next = NULL, .priority = 0};
  TCB TCB1 = {.next = &TCB2, .priority = 0};

  list.head = &TCB1;
  list.tail = &TCB2;

  addPriorityLinkedList(&list, &TCB3, comparePriority);
  TEST_ASSERT_EQUAL(&TCB1, list.head);
  TEST_ASSERT_EQUAL(&TCB3, list.tail);
  TEST_ASSERT_EQUAL(&TCB2, TCB1.next);
  TEST_ASSERT_EQUAL(&TCB3, TCB2.next);
  TEST_ASSERT_NULL(TCB3.next);
  
}

void test_addPriorityLinked_add_4_same_priority_into_list(){
  PriorityLinkedList list;
  createPriorityLinkedList(&list);
  
  TCB TCB4 = {.next = NULL, .priority = 0};
  TCB TCB3 = {.next = NULL, .priority = 0};
  TCB TCB2 = {.next = NULL, .priority = 0};
  TCB TCB1 = {.next = NULL, .priority = 0};

  list.head = &TCB1;
  list.tail = &TCB1;

  addPriorityLinkedList(&list, &TCB2, comparePriority);
  addPriorityLinkedList(&list, &TCB3, comparePriority);
  addPriorityLinkedList(&list, &TCB4, comparePriority);
  TEST_ASSERT_EQUAL(&TCB1, list.head);
  TEST_ASSERT_EQUAL(&TCB4, list.tail);
  TEST_ASSERT_EQUAL(&TCB2, TCB1.next);
  TEST_ASSERT_EQUAL(&TCB3, TCB2.next);
  TEST_ASSERT_EQUAL(&TCB4, TCB3.next);
  TEST_ASSERT_NULL(TCB4.next);
  
}

void test_addPriorityLinked_add_3_same_priority_into_list_and_removeFromHeadPriorityLinkedList_remove_3_from_list(){
  PriorityLinkedList list;
  createPriorityLinkedList(&list);
  TCB *removedElement;
  
  TCB TCB4 = {.next = NULL, .priority = 0};
  TCB TCB3 = {.next = NULL, .priority = 0};
  TCB TCB2 = {.next = NULL, .priority = 0};
  TCB TCB1 = {.next = NULL, .priority = 0};

  list.head = &TCB1;
  list.tail = &TCB1;

  addPriorityLinkedList(&list, &TCB2, comparePriority);
  TEST_ASSERT_EQUAL(&TCB2, list.head->next);
  TEST_ASSERT_EQUAL(&TCB1, list.head);
  TEST_ASSERT_EQUAL(&TCB2, list.tail);
  TEST_ASSERT_EQUAL(&TCB2, TCB1.next);
  TEST_ASSERT_NULL(TCB2.next);
  
  addPriorityLinkedList(&list, &TCB3, comparePriority);
  TEST_ASSERT_EQUAL(&TCB3, list.tail);
  TEST_ASSERT_EQUAL(&TCB2, TCB1.next);
  TEST_ASSERT_EQUAL(&TCB3, TCB2.next);
  TEST_ASSERT_NULL(TCB3.next);
  
  addPriorityLinkedList(&list, &TCB4, comparePriority);
  TEST_ASSERT_EQUAL(&TCB4, list.tail);
  TEST_ASSERT_EQUAL(&TCB2, TCB1.next);
  TEST_ASSERT_EQUAL(&TCB3, TCB2.next);
  TEST_ASSERT_EQUAL(&TCB4, TCB3.next);
  TEST_ASSERT_NULL(TCB4.next);
  
  removedElement = removeFromHeadPriorityLinkedList(&list);
  TEST_ASSERT_EQUAL(&TCB1, removedElement);
  TEST_ASSERT_EQUAL(&TCB2, list.head);
  TEST_ASSERT_EQUAL(&TCB3, list.head->next);
  TEST_ASSERT_EQUAL(&TCB4, list.tail);
  TEST_ASSERT_EQUAL(&TCB3, TCB2.next);
  TEST_ASSERT_EQUAL(&TCB4, TCB3.next);
  TEST_ASSERT_NULL(TCB4.next);
  TEST_ASSERT_NULL(TCB1.next);
  
  removedElement = removeFromHeadPriorityLinkedList(&list);
  TEST_ASSERT_EQUAL(&TCB2, removedElement);
  TEST_ASSERT_EQUAL(&TCB3, list.head);
  TEST_ASSERT_EQUAL(&TCB4, list.tail);
  TEST_ASSERT_EQUAL(&TCB4, list.head->next);  
  TEST_ASSERT_EQUAL(&TCB4, TCB3.next);
  TEST_ASSERT_NULL(TCB4.next);
  
  removedElement = removeFromHeadPriorityLinkedList(&list);
  TEST_ASSERT_EQUAL(&TCB3, removedElement);
  TEST_ASSERT_EQUAL(&TCB4, list.head);
  TEST_ASSERT_EQUAL(&TCB4, list.tail);
  TEST_ASSERT_NULL(TCB4.next);
}