数据结构c语言程序栈,数据结构之栈(C语言版)

写在前面:

实验报告留念完全是因为都是大学期间辛辛苦苦做的,一下子删掉实在心痛,所以在简书保留下来。

值得一提的是本人数学系学生,所用程序语言多是matlab,少部分C语言和JAVA,并且水平一般。由于仅仅是实验报告的留念,有部分内容缺失实属正常~

如果有值得参考之处自然不错,若有错误也希望大家指出~

实验要求

实现顺序栈的抽象数据类型

实现顺序栈的建立、销毁、取栈顶元素、压栈、弹栈的运算

给出表达式的括号匹配检测算法

创建运算符栈和运算数栈

实现有一定通用性的程序,实现一个四则运算表达式的求解

实验代码

实现顺序栈的抽象数据类型

typedef struct

{ SElemType *base;

SElemType *top;

int stacksize;

}SqStack;

实现顺序栈的建立、销毁、取栈顶元素、压栈、弹栈的运算

//建立

Status InitStack(SqStack &s)

{

s.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));

if(!s.base) exit(overflow);

s.top=s.base;

s.stacksize=STACK_INIT_SIZE;

return OK;

}

//销毁

void DestroyStack(SqStack &s)

{

free(s.base);

cout<

}

//取栈顶元素

Status GetTop(SqStack s,SElemType e)

{

if(s.top==s.base) return error;

e=*(s.top-1);

return OK;

}

//压栈

Status Push(SqStack &s,SElemType e)

{

if(s.top-s.base>=s.stacksize)

{

s.base=(SElemType *)realloc(

s.base,(s.stacksize+STACKINCREMENT)*sizeof(SElemType));

if(!s.base) exit(overflow);

s.top=s.base+s.stacksize;

s.stacksize+=STACKINCREMENT;

}//end of if

*s.top=e;

s.top++;

return OK;

}

//弹栈

Status Pop(SqStack &s,SElemType &e)

{

if(s.top==s.base) return error;

--s.top;

e=*s.top;

return OK;

}

给出表达式的括号匹配检测算法

Status matching(string exp)

{

SqStack s;

InitStack(s);

SElemType e;

int state=1,i=0,len;

len=exp.length();

while(i

switch(exp[i])

{

case '(':

case '[':

case '{':

{Push(s,exp[i]);i++;break;}

case ')':

{

GetTop(s,e);

if(!StackEmpty(s)&&e=='('){Pop(s,e);i++;}

else state=0;

break;

}

case ']':

{

GetTop(s,e);

if(!StackEmpty(s)&&e=='['){Pop(s,e);i++;}

else state=0;

break;

}

case '}':

{

GetTop(s,e);

if(!StackEmpty(s)&&e=='{'){Pop(s,e);i++;}

else state=0;

break;

}

default: i++;

}//end of switch

if(StackEmpty(s)&&!state) return OK;

else return error;

}

创建运算符栈和运算数栈

#include

#include

#include

#include

#include

using namespace std;

stack optr; // 操作符栈

stack opnd; // 操作数栈

实现有一定通用性的程序,实现一个四则运算表达式的求解

/* 利用两个栈进行模拟计算 */

double Compute()

{

stack optr; // 操作符栈

stack opnd; // 操作数栈

optr.push('#');

int len = strlen(s);

bool is_minus = true; // 判断'-'是减号还是负号

for (g_pos = 0; g_pos < len;)

{

//1. 负号

if (s[g_pos] == '-' && is_minus) // 是负号

{

opnd.push(0);

optr.push('-');

g_pos++;

}

//2. 是右括号 )

else if (s[g_pos] == ')')

{

is_minus = false;

g_pos++;

while (optr.top() != '(')

{

double a2 = opnd.top();

opnd.pop();

double a1 = opnd.top();

opnd.pop();

char op = optr.top();

optr.pop();

double result = Operate(a1, op, a2);

opnd.push(result);

}

optr.pop(); // 删除'('

}

//3. 数字

else if (s[g_pos] >= '0' && s[g_pos] <= '9')

{

is_minus = false;

opnd.push(Translation(g_pos));

}

//4. ( 左括号

else if (s[g_pos] == '(')

{

is_minus = true;

optr.push(s[g_pos]);

g_pos++;

}

//5. + - * / 四种

else

{

while (GetLevel(s[g_pos]) <= GetLevel(optr.top()))

{

double a2 = opnd.top();

opnd.pop();

double a1 = opnd.top();

opnd.pop();

char op = optr.top();

optr.pop();

double result = Operate(a1, op, a2);

opnd.push(result);

}

optr.push(s[g_pos]);

g_pos++;

}

}

while (optr.top() != '#')

{

double a2 = opnd.top();

opnd.pop();

double a1 = opnd.top();

opnd.pop();

char op = optr.top();

optr.pop();

double result = Operate(a1, op, a2);

opnd.push(result);

}

return opnd.top();

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值