两个队列实现一个栈

This commit is contained in:
yaha 2023-05-18 19:37:28 +08:00
parent 47ae4cce3c
commit 29ddbd5a3e
5 changed files with 108 additions and 2 deletions

View File

@ -10,7 +10,7 @@ file(GLOB_RECURSE SOURCES "src/*/*.cpp")
add_library(${APP_LIB_NAME} ${SOURCES})
include(cmake/googletest.cmake)
option(WITH_PROFILE ON)
option(WITH_PROFILE OFF)
if (${WITH_PROFILE})
add_definitions(-DENABLE_PROFILING)
include(cmake/gperftools.cmake)

View File

@ -2,8 +2,10 @@ set(APP_TEST_NAME leetcode_test)
message(STATUS "=========== start testing APP_TEST_NAME: ${APP_TEST_NAME} ==========")
set(TEST_SOURCES)
string(REGEX REPLACE ";" "\t\n" TMEP_SOURCES "${SOURCES}")
file(GLOB_RECURSE TEST_SOURCES "tests/*.cpp")
message(STATUS "=========== test_file: ${TEST_SOURCES}")
message(STATUS "=========== test_file =========== \n${TMEP_SOURCES}")
message(STATUS "=========== test_file =========== \n")
include(GoogleTest)

16
include/queue_vec.h Normal file
View File

@ -0,0 +1,16 @@
#pragma once
#include <stack>
namespace yaha {
class CQueue {
public:
CQueue() {
}
void append_tail(int value);
int delete_head();
private:
std::stack<int> _stk_tail;
std::stack<int> _stk_head;
};
}

View File

@ -0,0 +1,22 @@
#include "queue_vec.h"
namespace yaha {
void CQueue::append_tail(int value) {
_stk_tail.push(value);
}
int CQueue::delete_head() {
if(_stk_head.empty()){
while (!_stk_tail.empty()) {
_stk_head.push(_stk_tail.top());
_stk_tail.pop();
}
}
if (_stk_head.empty()) {
return -1;
}
int tmp = _stk_head.top();
_stk_head.pop();
return tmp;
}
}

View File

@ -0,0 +1,66 @@
#include <gtest/gtest.h>
#include "queue_vec.h"
/**
* appendTail deleteHead (deleteHead  -1 )
* Krahets
* https://leetcode.cn/leetbook/read/illustration-of-algorithm/5d3i87/
* LeetCode
*
*/
TEST(QueueWithTwoStackTest, BasicAssertions) {
/**
* 1
*
* ["CQueue","appendTail","deleteHead","deleteHead","deleteHead"]
* [[],[3],[],[],[]]
* [null,null,3,-1,-1]
*/
yaha::CQueue c_queue_1;
c_queue_1.append_tail(3);
ASSERT_EQ(c_queue_1.delete_head(), 3);
ASSERT_EQ(c_queue_1.delete_head(), -1);
ASSERT_EQ(c_queue_1.delete_head(), -1);
/**
*
* ["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
* [[],[],[5],[2],[],[]]
* [null,-1,null,null,5,2]
*/
yaha::CQueue c_queue_2;
ASSERT_EQ(c_queue_2.delete_head(), -1);
c_queue_2.append_tail(5);
c_queue_2.append_tail(2);
ASSERT_EQ(c_queue_2.delete_head(), 5);
ASSERT_EQ(c_queue_2.delete_head(), 2);
}
TEST(MoreQueueWithTwoStackTest, BasicAssertions) {
yaha::CQueue c_queue;
// 输入示例
std::vector<int> inputs =
{-1, -1, 97, -1, -1, -1, -1, 15, -1, 1, 43, -1, -1, -1, 18, -1, -1, -1, -1, 36, 69, 21, 91, -1, -1, 22, 40, -1,
-1, -1, 81, 65, -1, 77, -1, 63, 96, 5, -1, -1, 35, 90, -1, -1, -1, -1, 77, 83, -1, -1, 52, -1, 2, 66, 87, 90,
-1, 2, -1, -1, 33, 16, 72, -1, -1, 14, 78, 8, -1, -1, -1, -1, 3, 83, -1, -1, 13, -1, 79, 44, -1, -1, 33, -1,
55, 76, 12, -1, 91, 24, 49, 47, -1, -1, -1, 85, -1, 69, -1, 94, 52};
// 预期结果示例
std::vector<int> expected_results =
{-1, -1, 97, -1, -1, -1, -1, 15, -1, 1, 43, -1, -1, -1, 18, -1, -1, -1, -1, 36, 69, 21, 91, -1, -1, 22, 40, -1,
-1, -1, 81, 65, -1, 77, -1, 63, 96, 5, -1, -1, 35, 90, -1, -1, -1, -1, 77, 83, -1, -1, 52, -1, 2, 66, 87, 90,
-1, 2, -1, -1, 33, 16, 72, -1, -1, 14, 78, 8, -1, -1, -1, -1, 3, 83, -1, -1, 13, -1, 79, 44, -1, -1, 33, -1,
55, 76, 12, -1, 91, 24, 49, 47, -1, -1, -1, 85, -1, 69, -1, 94, 52};
// 处理每个操作序列
for (const auto &op : inputs) {
if (op==-1) {
// 删除头部并验证结果为-1
std::cout << c_queue.delete_head() << std::endl;
} else {
// 添加尾部
c_queue.append_tail(op);
}
}
}