ElemType data[MAX]这一句就是申请空间的 *** 作。
第二种都是指针,定义的时候没有内存的,所以使用的时候就需要分配空间。你说的是中缀表达式直接求值吧用2个栈,一个叫符号栈,一个叫数字栈,分别存运算符和数字。给每个符号一个优先级,+,-的优先级为1,,/的优先级为2,越先做的符号优先级越大。碰到数字直接进数字栈,碰到符号的话和符号栈的栈顶比一下,如果优先级小于等于符号栈的栈顶原素,就重复以下步骤:{把符号栈的栈顶取出,从数字栈取出2个数,将2个数颠倒(swap(a,b),因为栈是先进后出,把这2个数按照d出的符号进行运算,再将2个数的运算结果压入数字栈}直到符号栈的栈顶大于这个符号或者是栈空了,把新的符号压栈。碰到左括号就无条件压符号栈。碰到右括号就不断地腿符号栈,按照刚才的规则做,每次取符号栈站定和2个数字,并将数字颠倒,进行运算并压栈,直到栈顶是(为止,最后将栈顶的(取出。碰到等号则和上面做法一样,每次取符号栈站定和2个数字,并将数字颠倒,进行运算并压栈直到整个符号栈空位置。最后要的结果就是数字栈的栈顶。。。如果有中括号的话稍微麻烦点,可以给括号也编上优先级,方法几乎和只有小括号的一样。如果有问题可以问我,代码不长,100多行吧。。。我来给你分析吧
先压入e1、e2,然后e2出栈
再压入e3、e4,然后然后e4 出栈 e3出栈 最后e1出栈
估计你刚刚学数据结构吧 呵呵 进栈顺序并不是说全部进栈后才出栈的,是可以一部分先进去,然后出栈,后面还可以在压栈,其实这个有好几种顺序的#include<stdioh>
struct stack {
int arr[10];
size_t amount;
};
typedef struct stack stack_t;
int push(stack_t stack, int s);
int pop(stack_t stack, int s);
int main() {
stack_t stack;
stackamount = 0;
int selectValue;
int inputValue;
int outputValue;
while (true)
{
printf("请选择你要 *** 作1-入栈 0-出栈\n");
scanf("%d",&selectValue);
if(selectValue==1){
printf("请输入要入栈的值:\n");
scanf("%d",&inputValue);
push(&stack,inputValue);
}else if(selectValue==0){
pop(&stack,&outputValue);
printf("出栈,值是:%d\n",outputValue);
}else if(selectValue==-1) break; // 如果是-1则退出 *** 作
}
}
int push(stack_t stack, int s) {
if(stack->amount == 10) {
return -1;
}
stack->arr[stack->amount] = s;
stack->amount++;
return 0;
}
int pop(stack_t stack, int s) {
if(stack->amount == 0) {
return -1;
}
s= stack->arr[stack->amount-1]; // 此处要接受值
stack->amount--;
return 0;
}栈,记住先进后出,后进先出的原则就可以了
在这里,列出一种情况:比如说是1,2先进栈,2出栈,然后3, 4进栈那么输出的结果就是2431
可以用这个计算公式:Xn=(2n)!/[n!(n+1)!],有三个数的话就有5种可能的出栈方式#define stacksize 100//栈最大空间
typedef int elemtype;//栈中元素类型
typedef struct
{
int top;//栈顶指针
elemtype data[stacksize];
}stack;//顺序栈类型
void initstack(stack &s)//建立空栈
{
stop=-1;
}
void push(stack &s,elemtype e)//压栈
{
if(stop>=stacksize)
{
printf("full!");
return;
}
sdata[++stop]=e;
}
void pop(stack &s,elemtype &e)//d栈
{
if(stop<=-1)
{
printf("empty stack!");
return;
}
e=sdata[stop--];
}
bool stackempty(stack s)//判断栈非空
{
if(stop==-1)return true;
return false;
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)