数据结构之栈(C语言版)
2019-03-20 本文已影响1人
辛辛辛烷
写在前面:
实验报告留念完全是因为都是大学期间辛辛苦苦做的,一下子删掉实在心痛,所以在简书保留下来。
值得一提的是本人数学系学生,所用程序语言多是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<<"Success to destroy!";
}
//取栈顶元素
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<len&&state==1)
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 <iostream>
#include <algorithm>
#include <cstring>
#include <stack>
#include <cmath>
using namespace std;
stack<char> optr; // 操作符栈
stack<double> opnd; // 操作数栈
- 实现有一定通用性的程序,实现一个四则运算表达式的求解
/* 利用两个栈进行模拟计算 */
double Compute()
{
stack<char> optr; // 操作符栈
stack<double> 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();
}
其他相关文章:
数据结构之树的相关问题
数据结构之图、广度优先搜索以及佛洛依德算法