pop push min O(1)

#include <iostream>
#include <memory.h>
using namespace std;

#include<stdio.h>
#define STACK_LEN 7

typedef struct
{
	int data;
	int min;
}stackitem;

typedef struct
{
	stackitem data[STACK_LEN];
	int top;
}stack;

void push(stack *s,int val)
{
	s->data[s->top].data = val;
	if(s->top > 0) 			// 保证栈顶元素中的min始终为当前栈中最小值
	{
		if(val < s->data[s->top-1].min)   // 如果当前push进的元素小于栈中最小元素值
			s->data[s->top].min = val;	  // 把当前元素置为栈中最小元素值
		else
			s->data[s->top].min = s->data[s->top-1].min;
	}
	else		// 否则,不更新
		s->data[s->top].min = val;
	s->top++;
}
int pop(stack *s)
{
	if(s->top-1 >= 0)
		return s->data[--s->top].data;
	else
		return -1;
}
int min(stack*s)
{
	if(s->top-1 >= 0)
		return s->data[s->top-1].min;
	else
		return -1;
}
int main(int argc,char *argv[])
{
	stack s;
	memset(&s,0,sizeof(s));
	push(&s,5);
	push(&s,2);
	push(&s,1);
	push(&s,3);
	push(&s,7);
	push(&s,9);

	printf("pop: %d\n",pop(&s));
	printf("min: %d\n\n",min(&s));

	printf("pop: %d\n",pop(&s));
	printf("min: %d\n\n",min(&s));

	printf("pop: %d\n",pop(&s));
	printf("min: %d\n\n",min(&s));

	printf("pop: %d\n",pop(&s));
	printf("min: %d\n\n",min(&s));

    printf("pop: %d\n",pop(&s));
	printf("min: %d\n\n",min(&s));


	return 0;
}



/*

class C_Overflow {};


template<typename T, int MAX_SIZE = 10>
class C_MinStack
{
public:
    C_MinStack();
    bool IsEmpty() const { return nCurLen == 0; }
    bool IsFull() const  { return nCurLen == MAX_SIZE; }
	int GetSize() const  { return nCurLen; }

	const T& Top() const;
    const T& GetMin() const;
    int Push(const T& val);
    T Pop();

private:
    T arrAllItem[MAX_SIZE];
    int arrMinIndex[MAX_SIZE];
    int nCurLen;
	int nCurMinPos;
};

template<typename T, int SIZE>
C_MinStack<T, SIZE>::C_MinStack():nCurLen(0),nCurMinPos(0) {}

template<typename T, int SIZE>
const T& C_MinStack<T, SIZE>::Top() const
{
    if (IsEmpty())
    {
        throw C_Overflow();
    }

    return arrAllItem[nCurLen - 1];
}

template<typename T, int SIZE>
const T& C_MinStack<T, SIZE>::GetMin() const
{
    if (IsEmpty())
    {
        throw C_Overflow();
    }
    return arrAllItem[arrMinIndex[nCurMinPos - 1]];
}


template<typename T, int SIZE>
int C_MinStack<T,SIZE>::Push(const T& val)
{
    if (IsFull())
    {
        throw C_Overflow();
    }
    if (IsEmpty() || val < GetMin())
    {
        arrMinIndex[nCurMinPos++] = nCurLen;
    }

    arrAllItem[nCurLen++] = val;
	return nCurLen;
}


template<typename T, int SIZE>
T C_MinStack<T, SIZE>::Pop()
{
    if (IsEmpty())
    {
        throw C_Overflow();
    }

    T retVal = arrAllItem[--nCurLen];

    if (nCurLen == arrMinIndex[nCurMinPos-1])
    {
        nCurMinPos--;
    }

    return retVal;
}



int main(int argc, char * argv[])
{
	C_MinStack<int> objStack;

	objStack.Push(2);
	objStack.Push(4);
	objStack.Push(8);
	objStack.Push(6);
	objStack.Push(12);
	objStack.Push(10);
	objStack.Push(15);
	objStack.Push(1);

	cout << "Stack size is: " << objStack.GetSize() << ",Min value is: " << objStack.GetMin() <<  endl;
	objStack.Pop();
	cout << "Stack size is: " << objStack.GetSize() << ",Min value is: " << objStack.GetMin() <<  endl;
	objStack.Pop();
	cout << "Stack size is: " << objStack.GetSize() << ",Min value is: " << objStack.GetMin() <<  endl;
	objStack.Pop();
	cout << "Stack size is: " << objStack.GetSize() << ",Min value is: " << objStack.GetMin() <<  endl;

	return 0;
}
*/


 

### C语言中栈的 `push` 和 `pop` 操作 在C语言中,对于基于链表实现的栈结构,`push` 和 `pop` 是两个核心操作。下面展示如何定义这两个函数以及它们的具体工作原理。 #### 定义栈及其节点结构体 为了便于理解,这里再次给出栈和节点的定义: ```c typedef struct _Node { int data; struct _Node* next; } Node; typedef struct _Stack { Node* top; } Stack; ``` #### 初始化栈 创建一个新的栈实例时,需要将其顶部指针设置为空,表示这是一个空栈[^1]。 ```c void init_stack(Stack* s) { s->top = NULL; } ``` #### 实现 `push` 函数 当执行 `push` 操作时,会向栈顶添加新的元素。这涉及到分配内存给新节点,并更新栈顶指向该新节点。 ```c void push(Stack* s, int value) { // 创建新结点 Node* newNode = (Node*)malloc(sizeof(Node)); if (!newNode) return; // 内存不足处理 newNode->data = value; newNode->next = s->top; // 更新栈顶位置 s->top = newNode; } ``` #### 实现 `pop` 函数 `pop` 操作用于移除并返回当前位于栈顶的元素。需要注意的是,在删除之前应该保存好要弹出的那个节点的信息,之后释放被删除节点所占用的空间。 ```c int pop(Stack* s) { if (s->top == NULL) return INT_MIN; // 栈为空的情况 Node* temp = s->top; int poppedValue = temp->data; // 修改栈顶指针到下一个节点 s->top = s->top->next; free(temp); // 释放旧的栈顶空间 return poppedValue; } ``` 通过上述代码片段可以看出,`push` 和 `pop` 都是在维护着一个动态变化的单向链接列表——即所谓的“栈”。每次插入或取出都是针对这个列表的第一个元素来进行操作,从而实现了 LIFO 后进先出的行为模式[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值