C++模拟栈

主要包含一些简单的实现,用C++的类作为封装, 其中包含一些细节问题,比如存储数据元素的栈在初始化的时候不能用初始化列表,需要new申请空间,所以用完之后自然需要delete释放空间。

class MyStack
{
private:
	enum { STACK_INIT_SIZE = 10, STACK_INC_SIZE = 2 };//定义起始栈的大小为10,扩容增长为2倍
	int* data;
	int capacity;
	int top;
public:
	MyStack() :data(nullptr), capacity(STACK_INIT_SIZE), top(-1) 
	{
		data = new int[capacity];
	}
	MyStack(int sz) :data(nullptr), capacity(sz), top(-1)
	{
		data = new int[capacity];
	}
	~MyStack()
	{
		delete[]data;
		data = nullptr;
		capacity = 0;
		top = -1;
	}
	size_t Size()const
	{
		return top + 1;
	}
	bool Full()const
	{
		return capacity == Size();
	}
	bool Empty()const
	{
		return Size() == 0;
	}
	bool Push(int val)
	{
		if (Full() && Resize(capacity * STACK_INC_SIZE))return false;
		data[++top] = val;
		return true;
	}
	bool Pop()
	{
		if (!Empty())
		{
			top -= 1;
			return true;
		}
		return false;
	}
	bool Resize(int new_sz)
	{
		if (new_sz < Size())
		{
			new_sz = 2*Size();
		}
			int* new_data = new int[new_sz];
			int sz = Size();
			memmove( new_data,data, sz * sizeof(int));
			delete[]data;
			capacity = new_sz;
			data = new_data;
			return true;
	}
	int Top() //获取栈顶元素
	{
		return data[top];
	}
	const int& Top()const
	{
		return data[top];
	}
};
int main()
{
	MyStack mys;
	for (int i = 0; i < 100; i++)
	{
		cout << "push  " << i << "   " << mys.Push(i) << endl;
	}
	while (!mys.Empty())
	{
		int x = mys.Top();
		mys.Pop();
		cout << x << endl;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我可以回答这个问题。利用C数组模拟完成后缀表达式求值的步骤如下: 1. 定义一个数组作为,同时定义一个变量作为顶指针。 2. 从左到右扫描后缀表达式,遇到操作数时,将其压入中。 3. 遇到操作符时,弹出顶的两个元素,进行相应的计算,并将结果压入中。 4. 重复执行步骤2和3,直到扫描完整个表达式。 5. 最终,中只剩下一个元素,就是后缀表达式的计算结果。 代码示例: ``` #include<stdio.h> #include<string.h> #define MAXSIZE 100 float stack[MAXSIZE]; // 定义数组 int top = -1; // 定义顶指针 // 将元素压入中 void push(float item){ if (top == MAXSIZE-1){ printf("Stack Overflow\n"); return; } stack[++top] = item; } // 弹出顶元素 float pop(){ if (top == -1){ printf("Stack Underflow\n"); return -1; } return stack[top--]; } // 判断是否为操作符 int isOperator(char ch){ if (ch == '+' || ch == '-' || ch == '*' || ch == '/'){ return 1; } return 0; } // 计算后缀表达式的值 float evaluatePostfix(char postfix[]){ int len = strlen(postfix); for (int i = 0; i < len; i++){ char ch = postfix[i]; if (isOperator(ch)){ float op2 = pop(); float op1 = pop(); switch(ch){ case '+': push(op1 + op2); break; case '-': push(op1 - op2); break; case '*': push(op1 * op2); break; case '/': push(op1 / op2); break; } } else if (ch >= '0' && ch <= '9'){ push(ch - '0'); } } return stack[top]; } int main(){ // 后缀表达式 "23*6+" char postfix[] = "23*6+"; float result = evaluatePostfix(postfix); printf("Result = %f\n", result); return 0; } ``` 以上就是利用C数组模拟完成后缀表达式求值的过程和对应的代码实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我在凌晨等太阳¤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值