C++数组模拟栈

假装从零开始学数据结构(Day 4)

其实我有一点点基础,但是感觉基础十分的不扎实,现在我是大一时间还多,所以我打算从零开始学一遍

栈 , 先进后出的一种数据结构,本身难度没有什么,但常常会遇到单调栈相关的题目,就有一定的难度了,我们要先打好基础。

我们用栈模拟几种基本的操作:

实现一个栈,栈初始为空,支持四种操作:

  1. push x – 向栈顶插入一个数 x;
  2. pop – 从栈顶弹出一个数;
  3. empty – 判断栈是否为空;
  4. query – 查询栈顶元素
#include <iostream>
using namespace std;
int stack[100001], idx = 0;
void push(int a)
{
    stack[++idx] = a;
}
void pop()
{
    idx--;
}
int empty()
{
    if(!idx)
        return 0;
    else
        return 1;
}
int query()
{
    return stack[idx];
}
int main()
{
   int m;
   cin >> m;
   string s;
   int a;
   while(m--)
   {
       cin >> s;
       if(s == "push")
       {
           cin >> a;
           push(a);
       }
       else if(s == "pop")
       {
           pop();
       } else if(s == "empty")
       {
           if(empty())
           {
   
在C语言中,由于没有内置的泛型支持,我们通常通过结构体类型来间接实现类似功能,而不能直接创建像Java那样的泛型。你可以通过为每种数据类型定义一个特定的结构体,并提供通用的操作函数来模拟这种行为。 例如,我们可以创建一个模板(Template)类型的,其中包含一个数组些基本的操作(如入、出和检查是否为): ```c #include <stdio.h> #include <stdlib.h> // 泛型模板 typedef struct { void* data; // 存储不同类型的数据 size_t capacity; size_t top; // 顶元素的位置 } GenericStack; // 初始化 GenericStack* generic_stack_init(size_t capacity) { GenericStack* stack = (GenericStack*) malloc(sizeof(GenericStack)); if (!stack) return NULL; stack->data = malloc(capacity * sizeof(void*)); if (!stack->data) { free(stack); return NULL; } stack->capacity = capacity; stack->top = 0; return stack; } // 入操作,动态分配内存 void generic_stack_push(GenericStack* stack, const void* item) { if (stack->top == stack->capacity) { // 如果已满,需要扩大容量 stack->capacity *= 2; stack->data = realloc(stack->data, stack->capacity * sizeof(void*)); if (!stack->data) { // 内存分配失败,清理并退出 free(stack->data); free(stack); stack = NULL; return; } } // 将新数据放入顶 stack->data[stack->top++] = item; } // 出操作 void* generic_stack_pop(GenericStack* stack) { if (stack->top == 0) { printf("Stack is empty.\n"); return NULL; } void* popped_item = stack->data[--stack->top]; return popped_item; } // 检查是否为 int generic_stack_empty(const GenericStack* stack) { return stack->top == 0; } // 示例用法 int main() { GenericStack* int_stack = generic_stack_init(5); generic_stack_push(int_stack, &5); // 推入整数 generic_stack_push(int_stack, &10); // ...更多操作... printf("%d popped from the stack: %p\n", *(int*) generic_stack_pop(int_stack), generic_stack_pop(int_stack)); // 弹出并打印 free(int_stack->data); free(int_stack); return 0; }
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值