用来表示购物车内容的正确数据结构是什么?
- 链接列表
- 阵列
- 数组列表
- 其他的东西
我没有考虑什么是最方便的,即只使用数组,而是更多地考虑什么是正确的。
这将是一个非常标准的购物车的想法,它将包含以下内容:
- 关于购物车的基本元数据,如小计等
- 购物车项目的集合,每个项目都包含购物车信息的属性,如数量和价格,以及包含对基础产品访问权限的产品属性
以下内容也很重要:
- 应能够添加和删除项目
- 推车应该能够在一次操作中清空
- 在添加/删除项目时,应更新元数据的某些部分,如小计、数量等
- 数组:我不会这么做,因为你必须知道购物车里有多少商品,这会迫使你多次调整数组的大小/重新初始化数组
- LinkedList(在其实现中不使用Array):我主要会这样做,尤其是它符合您提到的其他需求
- 哈希集合:它可以使用,但不太适合这种情况,因为不需要某个关键元素快速访问篮子中的内容
最重要的是,我会简单地对购物车进行建模,因为大多数开发人员都会用订单项目列表来创建订单,所以我会有一个购物车类,其中有一个getter,用于显示项目总数、总价等,并使用链表对小圈子进行建模。
当然,如果分布是一个因素,您可能需要考虑它,但在大多数情况下,以上内容应该绰绰有余。
购物车的基本CPP程序
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
struct Item {
string name;
int quantity;
int price;
};
class ShoppingCart {
private:
vector<Item> item;
int total_price;
public:
ShoppingCart();
void addItem(string name, int quantity, int price);
void removeItem(string name, int quantity);
int getTotal();
};
ShoppingCart::ShoppingCart() {
cout << "Creating a new shopping cart" << endl;
total_price = 0;
}
void ShoppingCart::addItem(string name, int quantity, int price) {
for (int i = 0; i < item.size(); i++) {
if (item[i].name == name) {
item[i].quantity += quantity;
return;
}
}
Item temp;
temp.name = name;
temp.quantity = quantity;
temp.price = price;
item.push_back(temp);
}
void ShoppingCart::removeItem(string name, int quantity) {
for (int i = 0; i < item.size(); i++) {
if (item[i].name == name) {
if (item[i].quantity >= quantity) {
item[i].quantity -= quantity;
return;
}
cout << "Not enough items present in the cart to be removed" << endl;
return;
}
}
cout << "This item is not present in the cart" << endl;
}
int ShoppingCart::getTotal() {
total_price = 0;
for (int i = 0; i < item.size(); i++) {
total_price += item[i].quantity * item[i].price;
}
return total_price;
}
int main() {
ShoppingCart cart;
cart.addItem("Maggi", 10, 5);
cart.addItem("Biryani", 2, 15);
cart.addItem("Ketchup", 1, 5);
cout << "Total cost: " << cart.getTotal() << endl;
cart.addItem("Football", 2, 15);
cart.removeItem("Maggi", 4);
cart.removeItem("Ketchup", 2);
cout << cart.getTotal() << endl;
cart.addItem("Candy", 15, 2);
cart.removeItem("Bat", 1);
cout << "Total cost: " << cart.getTotal() << endl;
}